HOW TO:以原生函式存放物件參考
更新:2007 年 11 月
您可以使用包裝 GCHandle 的 gcroot.h,在 Unmanaged 記憶體中存放 CLR 物件參考。或者您也可以直接使用 GCHandle。
範例
// hold_object_reference.cpp
// compile with: /clr
#include "gcroot.h"
using namespace System;
#pragma managed
class StringWrapper {
private:
gcroot<String ^ > x;
public:
StringWrapper() {
String ^ str = gcnew String("ManagedString");
x = str;
}
void PrintString() {
String ^ targetStr = x;
Console::WriteLine("StringWrapper::x == {0}", targetStr);
}
};
#pragma unmanaged
int main() {
StringWrapper s;
s.PrintString();
}
StringWrapper::x == ManagedString
GCHandle 提供您在 Unmanaged 記憶體中存放 Managed 物件參考的方法。您可使用 Alloc 方法建立 Managed 物件的不透明控制代碼,並使用 Free 來釋放控制代碼。此外,Target 方法允許您從 Managed 程式碼中的控制代碼取回物件參考。
// hold_object_reference_2.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma managed
class StringWrapper {
IntPtr m_handle;
public:
StringWrapper() {
String ^ str = gcnew String("ManagedString");
m_handle = static_cast<IntPtr>(GCHandle::Alloc(str));
}
~StringWrapper() {
static_cast<GCHandle>(m_handle).Free();
}
void PrintString() {
String ^ targetStr = safe_cast< String ^ >(static_cast<GCHandle>(m_handle).Target);
Console::WriteLine("StringWrapper::m_handle == {0}", targetStr);
}
};
#pragma unmanaged
int main() {
StringWrapper s;
s.PrintString();
}
StringWrapper::m_handle == ManagedString