求助基础问题,关于dll引用路径的问题。

zjl1234567 2012-05-18 02:14:49
是这样的。我写的一个小程序,为了保持这个程序的绿色特征,只生成了一个可执行文件。

但我的程序引用了其他程序的托管dll。比如在c:\abc\ 下的托管dll。

我发现我的程序只有在c:\abc\下才能正常运行,否则报错:System.IO.FileNotFoundException: 未能加载文件或程序集(我引用的dll名)。

但c:\abc\的目录是在系统PATH变量里的。

我想问,托管dll的搜索范围不像win32dll那样的顺序么?当前目录,系统目录,path变量目录下?

如果别人把我所依赖的软件装到其他目录下,比如D:\cba\(但这个目录也在path变量里)。我该怎么做?

程序的属性设置里,引用路径的具体作用是什么?看msdn没看明白。谢谢
...全文
229 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fryhunter 2013-08-06
  • 打赏
  • 举报
回复
引用 3 楼 kay2010hh 的回复:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
  </configSections>
  <connectionStrings>
    <add name="人事管理系统.Properties.Settings.PersionAdminConnectionString" connectionString="Data Source=.;Initial Catalog=PersionAdmin;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="Splitter" value="1" />
    <!--0表示锁定拆分器,1表示未锁定-->
    <add key="BackImag" value="1" />
    <!--0表示不加载图片,1表示加载图片-->
    <add key="serverExpress" value="MSSQL$SQLEXPRESS" />
    <add key="serverSQL" value="MSSQLSERVER" />
    <add key="connectSQLServer" value="data source=.;Initial Catalog=PersionAdmin;Integrated Security=true" />
  </appSettings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Query;Add;Count;Del;Edit;change" />
    </assemblyBinding>
  </runtime>
</configuration>
最近正好做项目遇到这个问题,解决方案是看我给的代码里的红色部分。probing privatePath="Query;Add;Count;Del;Edit;change"这里引号中的内容替换成你的目录名。
牛,解决了我的问题。谢谢
zjl1234567 2012-05-23
  • 打赏
  • 举报
回复
我晕,没办法了么?高手给个方案啊
zjl1234567 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
楼上两位大侠,我的问题依然没有解决。

我看了msdn 有一点写的是“privatePath 中指定的目录必须是应用程序基目录的子目录。”

但我所引用的dll不一定被用户安装到哪,但路径肯定在path变量中。

我也不想让用户把我的程序必须放到指定目录。

还有,App.Config可以编译到exe中么?我只想发布一个exe文件。


我不是说……
[/Quote]

我所引用的dll是别人应用程序的,并且该dll还有很多依赖dll。并且这些dll都没有强名称。貌似不能加到gac。我看了你的连接。

我就纳闷,不能像win32那样方便么?现在path变量成摆设了?
threenewbee 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
楼上两位大侠,我的问题依然没有解决。

我看了msdn 有一点写的是“privatePath 中指定的目录必须是应用程序基目录的子目录。”

但我所引用的dll不一定被用户安装到哪,但路径肯定在path变量中。

我也不想让用户把我的程序必须放到指定目录。

还有,App.Config可以编译到exe中么?我只想发布一个exe文件。
[/Quote]

我不是说了另外一个办法了么,注册到GAC中。
zjl1234567 2012-05-21
  • 打赏
  • 举报
回复
楼上两位大侠,我的问题依然没有解决。

我看了msdn 有一点写的是“privatePath 中指定的目录必须是应用程序基目录的子目录。”

但我所引用的dll不一定被用户安装到哪,但路径肯定在path变量中。

我也不想让用户把我的程序必须放到指定目录。

还有,App.Config可以编译到exe中么?我只想发布一个exe文件。
kay2010hh 2012-05-20
  • 打赏
  • 举报
回复
红色没起作用,就是添加这部分内容

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Query;Add;Count;Del;Edit;change" />
</assemblyBinding>
</runtime>
kay2010hh 2012-05-20
  • 打赏
  • 举报
回复
当然前提是你要向项目中添加一个应用程序配置文件,AppConfig
kay2010hh 2012-05-20
  • 打赏
  • 举报
回复

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="人事管理系统.Properties.Settings.PersionAdminConnectionString" connectionString="Data Source=.;Initial Catalog=PersionAdmin;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="Splitter" value="1" />
<!--0表示锁定拆分器,1表示未锁定-->
<add key="BackImag" value="1" />
<!--0表示不加载图片,1表示加载图片-->
<add key="serverExpress" value="MSSQL$SQLEXPRESS" />
<add key="serverSQL" value="MSSQLSERVER" />
<add key="connectSQLServer" value="data source=.;Initial Catalog=PersionAdmin;Integrated Security=true" />
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Query;Add;Count;Del;Edit;change" />
</assemblyBinding>
</runtime>

</configuration>


最近正好做项目遇到这个问题,解决方案是看我给的代码里的红色部分。probing privatePath="Query;Add;Count;Del;Edit;change"这里引号中的内容替换成你的目录名。
threenewbee 2012-05-20
  • 打赏
  • 举报
回复
http://www.cnblogs.com/Charles2008/archive/2010/07/02/Assembly_Search.html

要点是注册GAC或者在App.Config中添加<probing privatePath="xxx"/>

111,126

社区成员

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

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

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