菜鸟问题:怎样将dll放到与.exe同一级目录的单独的文件夹中 而使exe同样能找到??

@oomoo@ 2009-03-28 03:41:36
基于VS2005的代码工程中引用了第三方库的dll文件,发布编译后的.exe程序时,需要将dll放到与.exe的同一级目录

可是我想将这些dll放到另一个文件夹,如下:
----|.exe
|lib---|a.dll
|b.dll
|c.dll
这时,就报找不到这些dll的错误了

该如何解决呢??

...全文
530 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
特别 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 hanlong2006 的帖子:]
基于VS2005的代码工程中引用了第三方库的dll文件,发布编译后的.exe程序时,需要将dll放到与.exe的同一级目录

可是我想将这些dll放到另一个文件夹,如下:
----|.exe
|lib---|a.dll
|b.dll
|c.dll
这时,就报找不到这些dll的错误了

该如何解决呢??


[/Quote]
针对你的目录结构,把
<probing privatePath="bin;bin2\subbin;bin3"/>
设置成
<probing privatePath="lib"/>
就应该可以了
特别 2009-03-31
  • 打赏
  • 举报
回复
app.Config中增加一小节
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>

//"bin;bin2\subbin;bin3"指你程序集所放的位置多个用分号分隔

具体可以参考MSND2005,VS2008的也是这样设置
MSDN2005关于于这个配置连接为 ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxconfig/html/1cb92bd7-6bab-44cf-8fd3-36303ce84fea.htm
定位位置为:开发工具和语言-->Visual Studio 文档-->.Net Framework核心开发-->Configuration 对象-->指定程序集的位置

可以在MSND中索引 <probing>
chuxue1342 2009-03-31
  • 打赏
  • 举报
回复
如果不要动态加载类的话,你引用dll文件的时候,他会自动放在bin文件夹下吧!为什么要改变文件夹呢/
POWER_WONG 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zgke 的回复:]
你可以考虑
System.Reflection.Assembly.LoadFile("\a\a.dll");
[/Quote]

帮顶一下!
CsToD 2009-03-31
  • 打赏
  • 举报
回复
看样子这60得全部给我了,呵呵:
dll里的那些类、方法等 莫非还要一个个反射出来?
请问 有没有简单一点的方法阿?

这个问题是可以解决的:
在AppDomain.AssemblyResolve事件中加载并返回程序集即可,不需要反射调用
冷月孤峰 2009-03-31
  • 打赏
  • 举报
回复
要么动态加载
要么使用10楼兄弟的方法
要么使用系统默认的方式(和exe文件在同一目录下)
whowhen21 2009-03-31
  • 打赏
  • 举报
回复
用Assembly 动态添加可以的吧
ztenv 2009-03-31
  • 打赏
  • 举报
回复
dllimport地加入相对路径试试
TkingCN 2009-03-31
  • 打赏
  • 举报
回复
在写入文件时 路径直接写(@"文件名")
@oomoo@ 2009-03-31
  • 打赏
  • 举报
回复
谢谢灰太狼 完全是我想要的
其实 “zgke”说的用反射动态加载技术 肯定也是可以的 只是杀鸡焉用宰牛刀呢 呵呵
谢谢各位回答 马上给分

[Quote=引用 23 楼 sdfkfkd 的回复:]
引用 20 楼 hanlong2006 的回复:
请问这*.Config文件在哪里啊?
怎么工程文件里面没有啊?
引用 18 楼 sdfkfkd 的回复:
app.Config中增加一小节
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>

//"bin;bin2\subbin;bin3"指你程序集所放的位置多个用分号分隔

具体可以参考MSND2005,VS2008的也是…
[/Quote]
hoveman 2009-03-31
  • 打赏
  • 举报
回复
嗯 的确很不错 很好的学习
特别 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hanlong2006 的回复:]
请问这*.Config文件在哪里啊?
怎么工程文件里面没有啊?
引用 18 楼 sdfkfkd 的回复:
app.Config中增加一小节
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>

//"bin;bin2\subbin;bin3"指你程序集所放的位置多个用分号分隔

具体可以参考MSND2005,VS2008的也是这样设置
MSDN2005关于于这个配置连接为 ms-…
[/Quote]
有可能没有的,如果有就在和你的*.EXE同一个文件夹中,如果没有,可以自己建立一个,
文件名必须是和你的Exe同名,如果你的Exe文件名为A.EXE,则Config的文件名必须为A.Exe.Config,
该文件可以直接用记事本建立,对你的问题,将下面内容复制进去就行了
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<gcConcurrent enabled="true" />
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<publisherPolicy apply="yes" />
<probing privatePath="lib" />
</assemblyBinding>
</runtime>
</configuration>
该种方法有一个限制:就是你的DLL文件必须放在与Exe文件相同的文件夹或者Exe文件所在文件夹的子文件夹中
kissyou886 2009-03-31
  • 打赏
  • 举报
回复
学习中,我马上就要面对这些问题了---
kkun_3yue3 2009-03-31
  • 打赏
  • 举报
回复
我多问一句,
楼主是不是嫌DLL太多呀?如果是这样的话,你可以考虑"如何合并多个DLL",详见http://www.cnblogs.com/kkun/archive/2008/12/22/1360005.html
@oomoo@ 2009-03-31
  • 打赏
  • 举报
回复
请问这*.Config文件在哪里啊?
怎么工程文件里面没有啊?
[Quote=引用 18 楼 sdfkfkd 的回复:]
app.Config中增加一小节
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>

//"bin;bin2\subbin;bin3"指你程序集所放的位置多个用分号分隔

具体可以参考MSND2005,VS2008的也是这样设置
MSDN2005关于于这个配置连接为 ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudi…
[/Quote]
Alden 2009-03-30
  • 打赏
  • 举报
回复
使用Assembly确实有点不好,首先你为什么要将这些dll放入另一个目录,如果是考虑到多个程序共享,那么你可以考虑是否使用装配件高速缓存。
@oomoo@ 2009-03-30
  • 打赏
  • 举报
回复
可是以前写的:
ClassA ca = new ClassA();
ca.Do();

是不是都要改成:
Assembly assembly = Assembly.LoadFrom(@"\lib\a.dll");
Type type = assembly.GetType("ClassA", true);
MethodInfo mi = type.GetMethod("Do");
Object o = Activator.CreateInstance(type);
mi.Invoke(o);


这还不麻烦?
请明示..

[Quote=引用 8 楼 linamong 的回复:]
不一定要一个一个添加.

可以全部获取DLL文件,然后全部加载.循环嘛.也不算麻烦.

这应该是唯一的方法
[/Quote]
linamong 2009-03-30
  • 打赏
  • 举报
回复
不一定要一个一个添加.

可以全部获取DLL文件,然后全部加载.循环嘛.也不算麻烦.

这应该是唯一的方法
@oomoo@ 2009-03-30
  • 打赏
  • 举报
回复
难道就没其它方法了??
郁闷。。。。
用了很多方法 又要重新反射!!
@oomoo@ 2009-03-30
  • 打赏
  • 举报
回复
dll里的那些类、方法等 莫非还要一个个反射出来?
请问 有没有简单一点的方法阿?
加载更多回复(5)

111,086

社区成员

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

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

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