2

我正在尝试使用我的应用程序中的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));
4

3 回答 3

2

无需固定它 - 编组将为您处理这一切。

它不必使用StringBuilder,但您可以(实际上最好这样做):

public static extern int GetSystemWow64Directory(StringBuilder lpBuffer, uint size);
于 2013-02-15T15:53:39.430 回答
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());
于 2013-02-15T17:09:06.300 回答
0

您传递给本机方法的对象会在编组器调用期间自动固定。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2

如果您传递给本机代码的对象将被异步使用(即在传递对象的调用完成执行之后),您只需要手动固定

于 2013-02-15T17:24:30.357 回答