在C ++中,我创建了这个类:
public ref class UConfig
{
public:
UConfig(short nr);
~UConfig();
bool checkNr();
private:
short _nr;
}
和C ++中将在C#中调用的公共类:
public ref class UConfigHandler
{
public:
UConfigHandler(UConfig^ uConfig);
}
然后在C#中,我可以这样做:
UConfig uConfig = new UConfig(1);
UConfigHandler uConfigHandler = UConfigHandler(uConfig);
在C ++中,我调试它,我在构造函数中:
UConfigHandler::UConfigHandler(UConfig^ uConfig)
{
// while debugging I see that uConfig is: System::Object^
// how to do the conversion from the uConfig to UConfig inside C++
// I would like to do something like this but I got an exception
UConfig myConfig = uConfig; // the program is stopped here but I dont know what is the error
}
所以,基本上我想将System :: Object ^ uConfig转换为本机UConfig。我怎么能这样做?
我做过的与String ^类似的字符串:
输入是String ^
IntPtr stringPointer = (IntPtr)Marshal::StringToHGlobalAnsi(input);
string retrievedString = string((char*)stringPointer.ToPointer());
答案 0 :(得分:2)
您正在尝试将UConfig
实例的句柄分配给UConfig
对象。您已将UConfig^ uConfig
声明为引用,因此您只能将其指定给引用。
如果你这样做,那将是C ++中的等价物:
MyClass* mcp = new MyClass();
MyClass mcv = mcp;
换句话说,您的UConfigHandler
构造函数应如下所示:
UConfigHandler::UConfigHandler(UConfig^ uConfig)
{
UConfig^ myConfig = uConfig;
}
你或许可以这样做......你可以整理struct
所以你也应该能够组织一个class
。我没有这样做,但Marshal.StructureToPtr的文档给出了一个类似的例子:
// Initialize unmanged memory to hold the struct.
IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(uConfig));
// Copy the struct to unmanaged memory.
Marshal.StructureToPtr(uConfig, pnt, false);
// Create another UConfig.
UConfig myConfig ;
// Set this UConfig to the value of the
// UConfig in unmanaged memory.
myConfig = (UConfig)Marshal.PtrToStructure(pnt, typeof(UConfig));
但是,您无法再利用垃圾收集:您已经分配了非托管内存,因此您还必须释放它!如果你没有释放分配的内存,你会得到内存泄漏,所以不要roget这样做:
// Free the unmanaged memory.
Marshal.FreeHGlobal(pnt);
答案 1 :(得分:1)
你想做什么?您在UConfig^
的构造函数中收到的ConfigHandler
是UConfig
.NET实例的完全有效句柄。没有必要对它进行编组,演员或做任何特别的事情。
所以,基本上我想将System :: Object ^ uConfig转换为本机UConfig。你能告诉我怎么办?
您发布的代码段中没有原生UConfig
。您在C#中创建实例并将其传递给存储对其的引用的ConfigHandler
:
public ref class ConfigHandler {
Config^ mConfig;
public:
ConfigHandler(Config^ pConfig) : mConfig(pConfig) {}
};
您甚至可以使用C#在完全不同的程序集中定义ConfigHandler
,没有区别。几乎没有,C ++ / CLI中定义的ConfigHandler
将实现IDisposable,但由于它不存储任何非托管资源,因此无关紧要。嗯,你是否意识到你不是在编写C ++而是C ++ / CLI这是一个巨大的差异?