是这样的。我写的一个小程序,为了保持这个程序的绿色特征,只生成了一个可执行文件。但我的程序引用了其他程序的托管dll。比如在c:\abc\ 下的托管dll。我发现我的程序只有在c:\abc\下才能正常运行,否则报错:System.IO.FileNotFoundException: 未能加载文件或程序集(我引用的dll名)。但c:\abc\的目录是在系统PATH变量里的。我想问,托管dll的搜索范围不像win32dll那样的顺序么?当前目录,系统目录,path变量目录下?如果别人把我所依赖的软件装到其他目录下,比如D:\cba\(但这个目录也在path变量里)。我该怎么做?程序的属性设置里,引用路径的具体作用是什么?看msdn没看明白。谢谢

解决方案 »

  1.   

    http://www.cnblogs.com/Charles2008/archive/2010/07/02/Assembly_Search.html要点是注册GAC或者在App.Config中添加<probing privatePath="xxx"/>
      

  2.   


    <?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"这里引号中的内容替换成你的目录名。
      

  3.   

    当然前提是你要向项目中添加一个应用程序配置文件,AppConfig
      

  4.   

    红色没起作用,就是添加这部分内容<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <probing privatePath="Query;Add;Count;Del;Edit;change" />
        </assemblyBinding>
      </runtime>
      

  5.   

    楼上两位大侠,我的问题依然没有解决。我看了msdn 有一点写的是“privatePath 中指定的目录必须是应用程序基目录的子目录。”但我所引用的dll不一定被用户安装到哪,但路径肯定在path变量中。我也不想让用户把我的程序必须放到指定目录。还有,App.Config可以编译到exe中么?我只想发布一个exe文件。
      

  6.   


    我不是说了另外一个办法了么,注册到GAC中。
      

  7.   


    我所引用的dll是别人应用程序的,并且该dll还有很多依赖dll。并且这些dll都没有强名称。貌似不能加到gac。我看了你的连接。我就纳闷,不能像win32那样方便么?现在path变量成摆设了?