我该如何为此代码指定P / invoke接口?

时间:2011-10-07 05:03:40

标签: c# pinvoke marshalling

在C ++中,我有一些代码需要传递const char *

void Load(const char *filename)

如果我尝试使用String,因为MSDN似乎暗示:

[DllImport("foo.dll")]
protected static extern void Load(String filename);

由于托管P / Invoke调用与实际C ++函数签名不匹配,我最终得到一个异常,说明调用堆栈不平衡。

我需要使用哪种合适的C#函数签名?我试过谷歌搜索答案,但我没有想出任何东西。


解决方案:事实证明我之所以遇到“不平衡堆栈”错误的原因是因为我运行的测试代码调用了一个实际上不存在于目录中的文件。使用CallingConvention=cdecl,并将文件放在适当的位置,问题就解决了。

2 个答案:

答案 0 :(得分:2)

问题是调用约定。虽然我们正在使用它,但您可能需要指定字符集,因为它可能会采用Unicode,否则:

[DllImport("foo.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.Cdecl)]
protected static extern void Load(String filename);

答案 1 :(得分:0)

您可以添加MarshalAsAttribute,例如

[DllImport("foo.dll")]
protected static extern void Load(
    [MarshalAs(UnmanagedType.LPStr)]string filename);

您可以将其中一个UnmanagedType enumeration值传递给MarshalAsAttribute构造函数。

另见this overview article over at Code Project