以下の「メイン」の2つのC#行で、低レベル/メモリ管理の観点から正確に何が起こっているのか説明できますか?
C++ コード (アンマネージ):
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT MyClass* MyClass_MyClass()
{
return new MyClass();
}
DLLEXPORT void MyClass_setName(MyClass* myClass, const char* name)
{
myClass->setName(name);
}
MyClass::MyClass()
{
_name.clear();
}
void MyClass::setName(const char* name)
{
_name.setCString(name, NAME_MAX_BYTES);
}
C# コード:
[DllImport(@"lib.dll")]
private static extern IntPtr MyClass_MyClass();
[DllImport(@"lib.dll")]
public static extern void MyClass_setName(
IntPtr myClass,
[System.Runtime.InteropServices.InAttribute()]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]
string name);
public static void Main(string[] args)
{
var myClass = MyClass_MyClass();
MyClass_setName(myClass , "Test Name");
}
具体的には、「myClass」に割り当てるスペースを .NET がどのように認識しているのか疑問に思っています。バックグラウンドで何らかの「Marshal.AllocHGlobal(SIZE)」を実行しているはずですよね?より多くのスペースが必要な場合 (名前を設定しますか?) はどうなりますか? また、ガベージコレクションが発生してメモリが移動し、「IntPtr myClass」が台無しになるリスクはありますか?