Phản ứng ruột của tôi là không, bởi vì bộ nhớ được quản lý và không được quản lý là khác biệt, nhưng tôi không chắc liệu .NET Framework có đang làm điều gì đó với Marshaling đằng sau hậu trường hay không.Sẽ thay đổi cấu trúc trong C# ảnh hưởng đến bộ nhớ không được quản lý?
Điều tôi tin là: Khi nhận cấu trúc từ DLL không được quản lý của tôi, nó giống như gọi hàm IntPtr và sau đó sử dụng nó và lớp Marshal để sao chép cấu trúc vào bộ nhớ được quản lý (và thay đổi được thực hiện để cấu trúc trong bộ nhớ được quản lý không bong bóng lên).
Tôi dường như không thể tìm thấy tài liệu này ở bất cứ đâu trên MSDN. Bất kỳ liên kết nào cũng sẽ được đánh giá cao.
Đây là những gì mã của tôi trông giống như:
[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?
}
Tôi nghĩ đây là câu trả lời đúng. Thực tế là không có gì móc vào cấu trúc (hoặc các trường của nó) để thay đổi trở lại bộ nhớ không được quản lý khi các trường của nó được thay đổi dường như kết luận trả lời câu hỏi này một cách dứt khoát. – userx