首页 新闻 会员 周边 捐助

C# 下调用C++封装的动态库

0
悬赏园豆:50 [已解决问题] 解决于 2011-08-17 09:16

现有自己封装的一个C++动态库。要在C#下进行调用。用DllImport加载到C#下,提示无法加载,在网上搜了下,一般原因都有两种,一个是路径不对,另一个是封装的DLL里面还有别的DLL,路径已查验是正确的。由于自己C++封装的DLL里面包含别的DLL(这些不是自己封装的没源码),所以原因90%锁定在是由于包含了别的DLL上了。

别人给的解决方法就是把这些C++封装时依赖的DLL也添加进去。但是现在问题是不知道怎么添加。DllImport不可以(主要是这个后面还要有接口函数,但是依赖的DLL的接口函数在C#下没用,再者接口函数很多的几十个而且又不止一个Dll)。

所以想高手有什么好的解决方法。有个例子什么的最好

PS:本人刚接触C#还望能说的详尽点。谢谢!~

问题补充:

静幽独白的主页 静幽独白 | 初学一级 | 园豆:145
提问于:2011-08-16 09:24
< >
分享
最佳答案
0

[DllImport("mediastream.dll", EntryPoint =" _rtprecv@8")]
static extern int rtprecv(int portbase, IntPtr playwnd);

注意你的EntryPoint名称,必须和Dependency看到的一样.

除此之外,你还得考虑CallingConvention属性.

收获园豆:50
Launcher | 高人七级 |园豆:45050 | 2011-08-16 21:42
按照你说的做了。在调用处
try
{
rtprecv(inBasePort, playhwd);
}
catch
{
MessageBox.Show("DLL False--------");
}
还是执行catch了。应该是没调用成功。不知道什么原因呢?
静幽独白 | 园豆:145 (初学一级) | 2011-08-17 08:40
我从新编译了下把原来的覆盖用你的方法可以了。不过有别的错误了。尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 我找找是什么错误。多谢了哈!分给你了。
静幽独白 | 园豆:145 (初学一级) | 2011-08-17 09:16
@静幽独白:内存已损坏,可以考虑CallingConvention,Charset的设置问题.不过通常都是函数签名不匹配(比如第二个参数IntPtr,dll内部是如何使用该IntPtr,是否需要先从非托管堆上分配一块和dll内部约定大小的内存),以及dll内部的错误.
Launcher | 园豆:45050 (高人七级) | 2011-08-17 20:21
好的,我好好排查下。谢了~
静幽独白 | 园豆:145 (初学一级) | 2011-08-18 09:18
其他回答(3)
0

你在引用里把那几个DLL库都添加进去就OK了吧

RoyYu | 园豆:217 (菜鸟二级) | 2011-08-16 09:31
是不可以添加引用的,提示说不是有效的程序集或com组件。谢谢~
支持(0) 反对(0) 静幽独白 | 园豆:145 (初学一级) | 2011-08-16 09:37
0

不是添加引用。。。而是直接考到运行目录下就可以了。

边城浪 | 园豆:264 (菜鸟二级) | 2011-08-16 14:50
问题上 我已经说了这种方法试过了。不可以。我是添加引用路径把所有依赖库都放在一个文件夹里了。
谢谢~
支持(0) 反对(0) 静幽独白 | 园豆:145 (初学一级) | 2011-08-16 15:27
还有就是确认一下版本...32位和64位的不同.
C#如果选择64位cpu 就不能调用32位的dll
支持(0) 反对(0) 边城浪 | 园豆:264 (菜鸟二级) | 2011-08-16 19:32
都是32位的,我是在一个机子上编译的。
支持(0) 反对(0) 静幽独白 | 园豆:145 (初学一级) | 2011-08-16 20:22
0

第一:把dll放到debug下,

第二:在程序中添加using System.Runtime.InteropServices;命名空间

第三:在代码中写申明方法

 

[DllImport("EPCSDK.dll", EntryPoint = "OpenComm")]
public static extern IntPtr OpenComm(int portNo);//打开端口,连接

.然后你再调用这个方法就可以了。。。

马战鹏 | 园豆:432 (菜鸟二级) | 2011-08-16 16:39
前面两个还理解。最后那个代码中的EPCSDK.dll和OpenComm;是自己的东西还是就是都这样就可以?
支持(0) 反对(0) 静幽独白 | 园豆:145 (初学一级) | 2011-08-16 20:18
[DllImport("mediastream.dll", EntryPoint = "rtprecv")]
static extern int rtprecv(int portbase, IntPtr playwnd);
我自己的代码。
支持(0) 反对(0) 静幽独白 | 园豆:145 (初学一级) | 2011-08-16 20:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册