我个人的看法是不行的,因为托管和非托管内存是不同的,但我不确定.NET Framework是否在后台使用了Marshaling。
我的理解是: 当从非托管DLL获取结构体时,调用返回一个IntPtr,然后使用Marshal类将结构体复制到托管内存中(在托管内存中对结构体所做的更改并不会传递到非托管DLL中)。
我似乎找不到这方面的MSDN文档,如果有链接请提供,谢谢。
以下是我的代码:
[DllImport("mydll.dll", BestFitMapping=false, CharSet=CharSet.Ansi)]
private static extern int GetStruct(ref MyStruct s);
[StructLayout(LayoutKind.Sequential, Pack=0)]
struct MyStruct
{
public int Field1;
public IntPtr Field2;
}
public void DoSomething()
{
MyStruct s = new MyStruct();
GetStruct(ref s);
s.Field1 = 100; //does unmanaged memory now have 100 in Field1 as well?
s.Field2 = IntPtr.Zero; //does unmanaged memory now have a NULL pointer in field Field2 as well?
}