我正在尝试使用我的应用程序中的GetSystemWow64Direcory方法。来自PInvoke.net的示例似乎对我不正确。在传递给非托管呼叫之前,我是否必须固定阵列?
[DllImport("Kernel32.dll")]
public static extern int GetSystemWow64Directory([In, Out] char[] lpBuffer
[MarshalAs(UnmanagedType.U4)] uint size);
char[] path = new char[256];
int result = GetSystemWow64Directory(path, (uint)path.Length);
if (result != 0)
MessageBox.Show(new String(path, 0, result));
答案 0 :(得分:2)
无需固定 - 编组将为您处理。
它 没有使用StringBuilder,但你可以(事实上它可能是最好的):
public static extern int GetSystemWow64Directory(StringBuilder lpBuffer, uint size);
答案 1 :(得分:2)
嗯,你不需要钉,编组将为你处理。
但是,这是一个糟糕的p / invoke。我的建议是不要相信你在pinvoke.net上发现的东西,质量是多种多样的。我在这里使用StringBuilder
。
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern int GetSystemWow64Directory(
StringBuilder Buffer,
int Size
);
....
StringBuilder Buffer = new StringBuilder(260);
int retVal = GetSystemWow64Directory(Buffer, Buffer.Capacity);
if (retVal != 0)
MessageBox.Show(Buffer.ToString());
答案 2 :(得分:0)
传递给本机方法的对象会在编组程序调用期间自动固定。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2
您只需手动固定您传递给本机代码的对象是否将被异步使用(即在传递完对象的调用完成后)