DllImport 这个怎么破?

csz_1987 2014-09-04 04:33:14
背景: Winform程序需要调用外设,外设厂商提供了一个动态库,由于后续还会使用到别的厂商的设备,为了不使最后的程序目录变得杂乱无章,希望能将这一套外设的动态库存放在一个文件内,如我希望非项目产生的dll都存放于程序运行目录下的others文件夹下。

外部DLL声明如下,存放与程序同级目录,一切调用正常。

[DllImport("Lib.dll", EntryPoint = "Test", CallingConvention = CallingConvention.StdCall)]
public static extern int Test();


我想把它放到Bin/Debug/Others文件夹下,但无论是写相对路径或者绝对路径(C:\Other\Lib.dll),均不成功。方法在调用的时候就拋错了。异常显示:无法加载 DLL“xxxxx\Lib.dll”: 动态链接库(DLL)初始化例程失败。 (异常来自 HRESULT:0x8007045A)。 异常类型:DllNotFoundException, 从异常来看,只是简单的认不到路径,但是我改了绝对路径,P/Invoke时 依然认不到,拋错。


[DllImport("\\Other\\Lib.dll", EntryPoint = "Test", CallingConvention = CallingConvention.StdCall)]
public static extern int Test();



请问,如何让Winform程序调用指定目录下的外部dll?
...全文
488 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
csz_1987 2014-09-05
  • 打赏
  • 举报
回复
引用 10 楼 wanghui0380 的回复:
http://stackoverflow.com/questions/8836093/how-can-i-specify-a-dllimport-path-at-runtime
谢谢,问题解决了。在P/Invoke前,通过Win32 API SetDllDirectory (string lpPathName)设置程序默认的搜索路径。 DllImport那边只声明dll 文件名即可。
wind_cloud2011 2014-09-04
  • 打赏
  • 举报
回复
http://www.cnblogs.com/szytwo/archive/2011/12/11/2283780.html
threenewbee 2014-09-04
  • 打赏
  • 举报
回复
10L的方法可以试试。另外也可以直接用LoadLibaray API,以及GetProcAddress。 11L的方法是针对托管dll的,对lz来说不适用。
失落的神庙 2014-09-04
  • 打赏
  • 举报
回复
这个dll是不是还有别的依赖项?
失落的神庙 2014-09-04
  • 打赏
  • 举报
回复
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="子目录名"/> </assemblyBinding> </runtime> </configuration>
wanghui0380 2014-09-04
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/8836093/how-can-i-specify-a-dllimport-path-at-runtime
by_封爱 版主 2014-09-04
  • 打赏
  • 举报
回复
如果你这么想 还不如把所有的DLL都扔到system32呢... 更干净了 毕竟 这些DLL都是非托管的 在system32下更合适..而且有的东西还需要驱动 正好驱动也在system32....
csz_1987 2014-09-04
  • 打赏
  • 举报
回复
引用 7 楼 diaodiaop 的回复:
http://www.cnblogs.com/szytwo/archive/2011/12/11/2283780.html 不过一般很少人这么干 新的DLL直接就替换旧的版本 向下兼容就行了..
这博文看过,没解决问题。 博文里说的: “Web中的,同时也是应用程序中的 后来发现用[DllImport(@"C:\OJ\Bin\Judge.dll")]这样指定DLL的绝对路径就可以正常装载。” 实际上他还是放在程序的同级目录。如果博主的Judge.dll 放到 C:\OJ\Bin\Other\Judge.dll 下, 我想他的 一样也是识别不到 Other目录里的Judge.dll。 目前就一个外设的dll,将来还会有扫描枪,读卡机,RFID读卡机的外设添加。 每个厂商都会给一个他们自己个dll给我们调用他们的设备。 为了使得目录结构清晰,我希望外设的dll统一存放于一个文件夹内。 我想应该挺多人都会想这么干的吧。保持程序运行目录的干净。
by_封爱 版主 2014-09-04
  • 打赏
  • 举报
回复
http://www.cnblogs.com/szytwo/archive/2011/12/11/2283780.html 不过一般很少人这么干 新的DLL直接就替换旧的版本 向下兼容就行了..
csz_1987 2014-09-04
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
到底是Others,还是Other 不会就差个s吧
不是,这个是我帖子里面输入错误,我也发现这个输入错误了,但是过了编辑时效了,csdn不给我权限编辑。 项目里的是对的。
於黾 2014-09-04
  • 打赏
  • 举报
回复
到底是Others,还是Other 不会就差个s吧
csz_1987 2014-09-04
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
晕,刷新之后,居然好用了 升级了? 改成Other\\Lib.dll这样试试 前面不要加多余的\\
还是一样,DllNotFoundException。找不到Dll。 还是 Winform不支持我的这种需求?感觉不应该啊。
於黾 2014-09-04
  • 打赏
  • 举报
回复
晕,刷新之后,居然好用了 升级了? 改成Other\\Lib.dll这样试试 前面不要加多余的\\
csz_1987 2014-09-04
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
<span style="color: #FF0000;">\\Other\\Lib.dll</span> 这是啥 在代码里加颜色不好用的
改了。想突出显示一下。
於黾 2014-09-04
  • 打赏
  • 举报
回复
<span style="color: #FF0000;">\\Other\\Lib.dll</span> 这是啥 在代码里加颜色不好用的

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧