我正在寻找有关更改返回/传递到 ap/invoke 函数的对象的结构/类布局的最佳实践指南。我一直在寻找这个问题的答案,但也许我太累了,我没有有效地寻找。
我能想到的最简单的例子(真正的例子在这里有点太复杂了)是像GetWindowRect这样的东西。
如果我想为 RECT 结构添加一些额外的属性,我应该将它添加到结构本身的定义中,还是应该切换到子类化以添加额外的属性?
Microsoft 或其他可靠来源围绕以下方法是否有最佳实践?这两者都违反最佳实践吗?
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; // x position of upper-left corner
public int Top; // y position of upper-left corner
public int Right; // x position of lower-right corner
public int Bottom; // y position of lower-right corner
public string Extra; // ADDED
}
相对
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(HandleRef hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
public class RECT
{
public int Left; // x position of upper-left corner
public int Top; // y position of upper-left corner
public int Right; // x position of lower-right corner
public int Bottom; // y position of lower-right corner
}
public class RectEx : RECT
{
public string Extra; // Added
public RectEx(RECT r)
{
Left = r.Left;
Top = r.Top;
Right = r.Right;
Bottom = r.Bottom;
Extra = "test";
}
}