有人可以在下面的“Main”中的 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");
}
具体来说,我想知道.NET 如何知道为“myClass”分配多少空间?它必须在后台执行某种“Marshal.AllocHGlobal(SIZE)”,对吗?如果需要更多空间会发生什么(我设置了名称?)?此外,是否存在垃圾收集和移动内存并弄乱我的“IntPtr myClass”的风险?