Может ли кто-нибудь объяснить, что именно происходит с точки зрения низкого уровня / управления памятью в строках 2 C # в «Main», следующим образом?
Код 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"?