gpt4 book ai didi

c# - 使用 C++/CLI 将对象从 C# 传递到 C++ 或将 Object^ 转换为 Object

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:17 27 4
gpt4 key购买 nike

在 C++ 中,我创建了这个类:

public ref class UConfig
{
public:
UConfig(short nr);
~UConfig();
bool checkNr();

private:
short _nr;
}

以及将在 C# 中调用的 C++ 公共(public)类:

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 转换为 native UConfig。我该怎么做?

我用 String^ 对字符串做了类似的事情:

input is String^

IntPtr stringPointer = (IntPtr)Marshal::StringToHGlobalAnsi(input);

string retrievedString = string((char*)stringPointer.ToPointer());

最佳答案

您正在尝试将 UConfig 实例的句柄分配给 UConfig 对象。您已将 UConfig^ uConfig 声明为引用,因此您只能将其分配给引用。

如果你这样做,它在 C++ 中是等价的:

MyClass* mcp = new MyClass();
MyClass mcv = mcp;

换句话说,您的 UConfigHandler 构造函数应该如下所示:

UConfigHandler::UConfigHandler(UConfig^ uConfig)
{
UConfig^ myConfig = uConfig;
}

更新

您也许可以做到...您可以编码一个结构,所以您也应该能够编码一个。我没有这样做,但是 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);

关于c# - 使用 C++/CLI 将对象从 C# 传递到 C++ 或将 Object^ 转换为 Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9910186/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com