C++ cli C+型铸造+\CLI项目

C++ cli C+型铸造+\CLI项目,c++-cli,C++ Cli,我有一个正在使用/clr编译的项目。我有一门课,如下所示 ref class A { public: void CheckValue(void * test); typedef ref struct val { std::string *x; }val_t; }; void A::CheckValue(void *test) { a::val_t^ allVal = (a::val_t^)test; } 在我的实现中,我必须使用如下内容 ref class A { public:

我有一个正在使用/clr编译的项目。我有一门课,如下所示

ref class A
{
public:
 void CheckValue(void * test);
 typedef ref struct val
{
 std::string *x;
}val_t;

};
void A::CheckValue(void *test)
{
 a::val_t^ allVal = (a::val_t^)test;
}
在我的实现中,我必须使用如下内容

ref class A
{
public:
 void CheckValue(void * test);
 typedef ref struct val
{
 std::string *x;
}val_t;

};
void A::CheckValue(void *test)
{
 a::val_t^ allVal = (a::val_t^)test;
}
在我的主要工作中,我用过像

int main()
{
A^ obj = gcnew A();
a::val_t valObj = new std::string("Test");
obj->CheckValue((void*)valObj);
}
我得到类型转换错误和两个位置- obj->CheckValue((void*)valObj); 在 obj->CheckValue((void*)valObj); 错误C2440:“类型转换”:无法从“void*”转换为“A::val\u t^”

这段代码只是为了展示我的行为,我只能这样使用它。早些时候,我使用非/clr运行它,因此它编译得很好


现在,我有一个问题:如何在C++/CLI类型的项目中使用这种类型转换?

用Object^替换void*。您也可以编写CheckValue的泛型版本,但是如果泛型参数中有弱类型参数,那么使用弱类型参数就没有多大意义


引用句柄表示托管堆上的对象。与本机指针不同,CLR可以在函数调用期间移动对象,因此指针和引用句柄的行为不同,类型转换将失败。如果您确实需要一个void*,您也可以使用pin_ptr锁定被引用的对象,这样CLR就不会在函数调用期间移动该对象。

以下是我如何绕过您看到的限制,只需从托管对象中删除该结构,因为它包含本机指针类型

struct val_t
{
  char* x;
};

ref class A
{
public:
  void CheckValue(void* test);
};

void A::CheckValue(void* test)
{
  val_t* allVal = (val_t*)test;
}

int main()
{
  A^ obj = gcnew A();
  val_t valObj;
  valObj.x = "Test";
  obj->CheckValue((void*)&valObj);
}
现在,如果您确实需要管理结构,下面是如何做到这一点:

ref class A
{
public:
  void CheckValue(void * test);
  value struct val_t
  {
    char* x;
  };
};

void A::CheckValue(void *test)
{
  a::val_t* allVal = (a::val_t*)test;
}

int main()
{
  A^ obj = gcnew A();
  a::val_t valObj;
  valObj.x = "Test";
  pin_ptr<a::val_t> valPin = &valObj;
  obj->CheckValue((void*)valPin);
}
ref A类
{
公众:
无效校验值(无效*测试);
值结构值
{
char*x;
};
};
void A::CheckValue(void*test)
{
a::val_t*allVal=(a::val_t*)测试;
}
int main()
{
A^obj=gcnew A();
a::瓦卢·瓦洛布;
valObj.x=“测试”;
pin_ptr valPin=&valObj;
obj->CheckValue((void*)valPin);
}

ref结构
不会被装箱,因为在C++/CLI中
ref结构
ref类
都是
ref
。要进行实际的值类型,需要键入
值类
值结构
。此代码有很多错误。但基本前提是有严重缺陷的,不能将原始指针变成托管对象。只有使用gcnew分配的对象才可以是托管对象,它们需要在GC堆上分配。@Hans我同意它们与所示代码有很多问题。我用整个程序创建了一个代码段。我的目的只是想创造一个我所处的环境,并寻求一种摆脱它的方法。如果给您带来不便,我深表歉意。您不能在非托管类型和托管类型之间进行强制转换。不清楚您试图用此示例实现什么。在pin_ptr示例中,只需编写:obj->CheckValue((void*)&valObj);