gpt4 book ai didi

.net - 如何将托管对象发送到 native 函数来使用它?

转载 作者:行者123 更新时间:2023-12-02 08:05:28 25 4
gpt4 key购买 nike

如何将托管对象发送到 native 函数来使用它?

void managed_function()
{
Object^ obj = gcnew Object();

void* ptr = obj ??? // How to convert Managed object to void*?

unmanaged_function(ptr);
}

// The parameter type should be void* and I can not change the type.
// This function is native but it uses managed object. Because type of ptr could not be
// Object^ I called it "Unmanaged Function".
void unmanaged_function(void* ptr)
{
Object^ obj = ptr ??? // How to convert void* to Managed object?

obj->SomeManagedMethods();
}

最佳答案

更干净、更好的方法是使用 gcroot模板。

引自 MSDN How to: Declare Handles in Native Types :

The gcroot template is implemented using the facilities of the value class System::Runtime::InteropServices::GCHandle, which provides "handles" into the garbage-collected heap. Note that the handles themselves are not garbage collected and are freed when no longer in use by the destructor in the gcroot class (this destructor cannot be called manually). If you instantiate a gcroot object on the native heap, you must call delete on that resource.

您的示例代码适用于使用 gcroot(代码使用 VS 2010 编译和运行):

using namespace System;
using namespace System::Runtime::InteropServices;

public ref class SomeManagedObject
{
public:
String^ data;
SomeManagedObject()
{
data = "Initial Data";
}
void SomeManagedMethods()
{
data = "Changed Data";
}
};

void unmanaged_function(void* ptr)
{
gcroot<SomeManagedObject^>& obj = *((gcroot<SomeManagedObject^>*)ptr);
obj->SomeManagedMethods();
}

void managed_function()
{
// gcroot handles all allocations/deallocation and convertions
gcroot<SomeManagedObject^>* pObj = new gcroot<SomeManagedObject^>();

*pObj = gcnew SomeManagedObject();
unmanaged_function(pObj);

delete pObj;
}

关于.net - 如何将托管对象发送到 native 函数来使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7371775/

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