我应该在调用GetSystemWow64Directory之前固定我的数组

时间:2013-02-15 15:39:32

标签: c# winapi pinvoke

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

3 个答案:

答案 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

您只需手动固定您传递给本机代码的对象是否将被异步使用(即在传递完对象的调用完成后)