C#中加载dll的问题
2015-07-16 21:12
302 查看
最近在做C#上进行H264解码的网络摄像头,通过各种折腾,还是没法解决,无奈之下只好使用在C#下加载ffmpeg的动态库进行,在加载的时候说不遇到问题那是不可能的。
下面就我遇到的问题和解决方案进行发表:
1.加载方法
很多人都想着通过右键引用的方法进行dll的加载,当然那是简便的方法,不过对于用C++编译的动态库貌似这方法行不通,往往会提示“未能添加XXX.dll的引用。请确保此文件可访问并且是一个有效的程序集或COM组件”。因此,本人想通过右键引用的方法行不通。
囧么办呢?
用DllImport加载吧。
[DllImport("XXX.dll")]
public static extern void XXX();
当然,DllImport还有一些参数和方法可以避免一些问题的,我也没仔细研究透在这先不去介绍。
通过这个加载之后你只要把相关的dll放到bin\Debug或bin\Release目录下就行了。
行了?
如果能用那就行了呗,还想什么,如果不能用呢,废话,那当然不行了。
2.“无法加载 DLL“XXX.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。”
遇到这类问题可以考虑两个方面
(1). 路径是否正确
在C#中不知道是不是路径不对的问题怎么验证?
很简单,在你调用dll的函数之前加上这句话,看看你的dll是都在程序路径中
MessageBox.Show(AppDomain.CurrentDomain.BaseDirectory);
(2). dll中是否用到了别的dll了
如果是这个问题的话,你只能去找找你的dll看看是否用到了其他的dll了,关于怎么通过一个dll去看他是否依赖别的dll这一问题我目前也没有明确的办法。
3.知道dll中有些啥函数
我在加载dll的时候不知道dll中有哪些接口怎么办,或者使用别人封装的东西时报出类似于“无法在 DLL“XXX.dll”中找到名为“XXX函数”的入口点。”
在这里我是通过LordPE这个软件来看dll中都有些啥函数的。
这里讲一下怎么使用这软件看dll中的函数:
打开软件
![](http://img.my.csdn.net/uploads/201303/19/1363675307_1590.png)
点击“PE 编辑器”按钮,选择你要查看的dll
![](http://img.my.csdn.net/uploads/201303/19/1363675334_8187.png)
选择“目录”
![](http://img.my.csdn.net/uploads/201303/19/1363675361_6962.png)
点击红笔部分的“..”按钮
![](http://img.my.csdn.net/uploads/201303/19/1363675378_1269.png)
瞧,这不把所有函数都不显示出来了没
如果你的程序提示“无法在 DLL“XXX.dll”中找到名为“XXX函数”的入口点”这个错误,你可以考虑考虑看看你的dll有木有这个函数
下面就我遇到的问题和解决方案进行发表:
1.加载方法
很多人都想着通过右键引用的方法进行dll的加载,当然那是简便的方法,不过对于用C++编译的动态库貌似这方法行不通,往往会提示“未能添加XXX.dll的引用。请确保此文件可访问并且是一个有效的程序集或COM组件”。因此,本人想通过右键引用的方法行不通。
囧么办呢?
用DllImport加载吧。
[DllImport("XXX.dll")]
public static extern void XXX();
当然,DllImport还有一些参数和方法可以避免一些问题的,我也没仔细研究透在这先不去介绍。
通过这个加载之后你只要把相关的dll放到bin\Debug或bin\Release目录下就行了。
行了?
如果能用那就行了呗,还想什么,如果不能用呢,废话,那当然不行了。
2.“无法加载 DLL“XXX.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。”
遇到这类问题可以考虑两个方面
(1). 路径是否正确
在C#中不知道是不是路径不对的问题怎么验证?
很简单,在你调用dll的函数之前加上这句话,看看你的dll是都在程序路径中
MessageBox.Show(AppDomain.CurrentDomain.BaseDirectory);
(2). dll中是否用到了别的dll了
如果是这个问题的话,你只能去找找你的dll看看是否用到了其他的dll了,关于怎么通过一个dll去看他是否依赖别的dll这一问题我目前也没有明确的办法。
3.知道dll中有些啥函数
我在加载dll的时候不知道dll中有哪些接口怎么办,或者使用别人封装的东西时报出类似于“无法在 DLL“XXX.dll”中找到名为“XXX函数”的入口点。”
在这里我是通过LordPE这个软件来看dll中都有些啥函数的。
这里讲一下怎么使用这软件看dll中的函数:
打开软件
![](http://img.my.csdn.net/uploads/201303/19/1363675307_1590.png)
点击“PE 编辑器”按钮,选择你要查看的dll
![](http://img.my.csdn.net/uploads/201303/19/1363675334_8187.png)
选择“目录”
![](http://img.my.csdn.net/uploads/201303/19/1363675361_6962.png)
点击红笔部分的“..”按钮
![](http://img.my.csdn.net/uploads/201303/19/1363675378_1269.png)
瞧,这不把所有函数都不显示出来了没
如果你的程序提示“无法在 DLL“XXX.dll”中找到名为“XXX函数”的入口点”这个错误,你可以考虑考虑看看你的dll有木有这个函数
相关文章推荐
- C#枚举遍历--Enum
- C#学习笔记(十三):I/O操作
- 黄聪:C#中WebClient自动判断编码是UTF-8还是GBK,并且有超时判断功能
- c#编程技术之------初衷
- C# 反射
- C# Thread Programming Start
- C#中Math.Round()实现中国式四舍五入
- c#休眠
- c#获取汉字的字节长度
- C#实现插件式开发的一个Demo分享
- C# 中解决页面刷新后字体等变大问题
- c#学习笔记(二):保存图片、保存DataGridView数据到本地和从本地读取到DataGridView
- C#中的Dictionary字典类介绍
- 在C#中??和?分别是什么意思?
- C#去掉字符串中的汉字
- C#高级编程四十一天----用户定义的数据类型转换
- C#中一种替换switch语句更优雅的写法
- C#实现利用泛型将DataSet转为Model的方法
- C#中事务处理和非事务处理方法实例分析
- C#中Abstract和Virtua笔记,知识