2011-10-07 60 views
2

在C++中我有些需要一个const char *代码中传入:我应该如何为这段代码指定P/invoke接口?

void Load(const char *filename) 

如果我尝试使用String作为MSDN似乎表明:

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

我最终得到一个异常,说明由于被管理的P/Invoke调用和实际的C++函数签名之间不匹配,调用会有不平衡的堆栈。

什么是我需要使用的适当的C#函数签名?我试过Google的搜索结果,但我没有提出任何问题。


解决办法:事实证明,为什么我得到了一个“不平衡的堆栈”错误的原因是因为测试代码我跑呼吁未实际存在于目录中的文件。使用CallingConvention=cdecl,并将文件放在适当的位置,问题就解决了。

+0

看看下面这个问题:http://stackoverflow.com/questions/7666144/making- c-dll-for-c –

回答

2

问题是调用约定。虽然我们在此,但可能需要指定字符集,因为它可能会假定为Unicode:

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

'CallingConvention'对我来说没什么意义,因为我有一些其他声明可以正常导入,而且不需要Cdecl。为什么这需要它?不过,我会尝试'CharSet.Ansi'。 –

+0

其他的是什么?标准的Windows函数是stdcall [默认],但是你在C++中创建的函数可能是cdecl。 – Random832

+0

我正在导入的所有函数都声明为'Cdecl'。这是由于const char *参数引起的唯一问题。 –