vs2010 C#调用C++的DLL问题 未能添加对xx.dll的引用

我一开始用记事本写C++文件然后用cl和link产生的dll出现这种问题之后看了好多网上的解释有说是版本问题然后我有用VS2010自带的C++写同样的程序产生的DLL也同... 我一开始用记事本写C++文件 然后用cl 和 link 产生的dll 出现这种问题 之后看了好多网上的解释 有说是版本问题 然后我有用VS2010自带的C++写同样的程序 产生的DLL 也同样出现这种问题。 求大神解释,非常感谢,我把我写的C++也程序粘出来,FYI。
//输入输出字符串传递测试

extern "C" __declspec(dllexport) int TCharPara(char *in, int len, char *out)

{

memcpy(out, in, len);

return 0;

}
部分C#代码如下:
using System.Runtime.InteropServices;
namespace CallDll
{
[StructLayout(LayoutKind.Sequential)]

public struct _XY
{

public int x;

public int y;

};
public class TCallCDll
{

[DllImport("dll.dll")]
//iin: 输入参数
//oout: 输出参数
public static extern int TCharPara(String iin, int len, StringBuilder oout);
//调用
TCallCDll.TStructPara(ref xy);
}
}
完全不用担心语法问题 调试都行 就是运行 找不到方法。
展开
 我来答
乳娃娃囧歪歪
2014-02-06 · TA获得超过151个赞
知道答主
回答量:36
采纳率:0%
帮助的人:40.6万
展开全部
您好。
试试以下方法:

不添加引用,在源码头部添加:
using System.Runtime.InteropServices;
然后在类中声明方法:
[DllImport("dll.dll")]
extern 函数返回类型 函数名(参数);
更多追问追答
追问
你说的我都用了
对 PInvoke 函数“CallDll!CallDll.TCallCDll::TCharPara”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
追答
楼上回答正确,使用[DllImport("dll.dll", EntryPoint="TCharPara", CallingConvention=CallingConvention.Cdecl)]

另外C的char*参数应转换为C#的System.String,也就是说方法应该声明为
public static extern int TCharPara(String iin, int len, String oout);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
空雪梦见
推荐于2018-05-17 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1180万
展开全部
因为调用C的DLL的时候根本不是这样引用的……

[DllImport("wtf.dll", EntryPoint="TCharPara", CallingConvention=CallingConvention.Cdecl)]
extern static int TCharPara(IntPtr pIn, int pLen, IntPtr pOut);

其中IntPtr也可以改为 ref xxxx(某种结构体类型)
或者 byte[]、int[] 等数组(此时类似Array.Copy吧?大概
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式