如何在 C# 中传递作为结构的可选参数

How to pass an Optional parameter that is a struct in C#

所以我 运行 遇到了这种不幸的情况,正如标题所说,我必须编写一个带有可选 struct 参数的函数声明。

这里是 struct:

[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
  public int nLength;
  public IntPtr lpSecurityDescriptor;
  public int bInheritHandle;
}

这是.dll中的函数advapi.dll:

LONG WINAPI RegSaveKey(
_In_     HKEY                  hKey,
_In_     LPCTSTR               lpFile,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

到目前为止,这是我的声明:

[DllImport("advapi32.dll", SetLastError = true)]
static extern int RegSaveKey(UInt32 hKey, string lpFile, [optional parameter here!!] );

为此,您应该将第三个参数声明为 IntPtr。 当你想传递它 null 时,给它 IntPtr.Zero。 如果你想传递一个真实的结构给它,Marshal 结构进入内存 - 即像这样的东西

SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
// set anything you want in the sa structure here

IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SECURITY_ATTRIBUTES)));
try {
    Marshal.StructureToPtr(sa, pnt, false)

    // call RegSaveKey here 
} finally {
    Marshal.FreeHGlobal(pnt);
}