vs2010 C#调用C++的DLL问题 未能添加对xx.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);
}
}
完全不用担心语法问题 调试都行 就是运行 找不到方法。

第1个回答  2014-02-06
您好。
试试以下方法:

不添加引用,在源码头部添加:
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);

追问

dll的路径不用设置么

第2个回答  推荐于2018-05-17
因为调用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吧?大概本回答被提问者和网友采纳

vs2010 C#调用C++的DLL问题 未能添加对xx.dll的引用
不添加引用,在源码头部添加:using System.Runtime.InteropServices;然后在类中声明方法:[DllImport("dll.dll")]extern 函数返回类型 函数名(参数);

vs2010 C#添加DLL文件引用失败
你在添加引用时, 别选[浏览]选项卡, 点[COM]选项卡看看里头有没有"XdictGrb 1.0 Type Library" 这一项 如果没有, 那应该是你没有注册这个COM组件, 用管理员帐户打开CMD命令行, 运行regsvr32 "路径\\xdictgrb.dll" 试试看, 如果运行完提示你注册成功了, 你再进VS中引用就行了 ...

C#无法调用C++编的DLL
就跟你说一下吧,你这种是缺少DLL依赖的mainifest导致的;为什么你安装了vcredist还不行,这是因为从VC2005-VC2008,CRT和MFC库都有好几个版本,你们开发用的版本跟你安装的vcredist是不同的版本 那怎么解决这个问题,很简单,从你的开发机器上(就是编译C++ DLL那个开发机)复制对应的DLL就行了,DLL...

c#.net vs2010 添加office引用 总出错
可能原因:1、stdole.dll这个dll文件不在项目中,所以编译的时候报错。解决方法,将你的stdole.dll这个文件先复制到项目中,然后再添加引用。编译应该就不会报错了。2、项目的目标框架不是.net 4.0。解决方案:选中项目右键→属性→目标框架选择.NET Framework 4.0。你试试,如果你的dll是没有问题的...

在VS2010中,我在添加引用中已经引用了一个命名空间,可是为什么在写程序...
这是因为引用的多个dll间,存在命名冲突,可以在命名空间的名前 加区别字符,比如DB, 前加 My, 变成 MY.DB , 比如Entity, 前加 My, 变成 MY.Entity ; 这样在代码中就能"using MY.DB; using MY.Entity ;"

VS2010 c++编写的程序 别人的机子运行不了 缺少mfc100u.dll xxx100d...
1.将这些dll打包,和你的程序一起发布 2.是用静态编译

c++用vs2010环境开发 怎么添加c语言开发的动态链接库
自己开发的dll可以放在工程的当前工作目录下,用#pragma comment (lib,“Mylibname.lib”)命令引入;Mylibname.lib是你自己的链接库。也可以在解决方案资源管理器的项目上右键,属性,配置属性,链接器,输入,附加依赖项,添加你自己的库进去,多个库之间用空格隔开 ...

vs2010怎么调试带dll的程序
1.打开Visual Studio 2010 2 新建项目:文件》新建》项目 选择Visual c++》Win32 项目》输入项目名称,选择保存目录,单击“确定”按钮 进入Win32应用程序向导,单击“下一步”按钮 应用程序类型选择DLL,附加选项选择空项目,单击“完成”按钮 添加新类头文件:在项目的头文件目录上单击鼠标右键》添加》...

在VS2010下怎样调用 VS2010生成的dll
如果是c或者C++写的dll,调用方法和VS版本并无什么关系

vs2010中加入dll引用了,怎么还提示找不到呢?
加了引用后,关闭vs,再打开,可能是缓存问题。没问题的。

相似回答