如何为应用程序设置C#库路径?

时间:2009-03-10 11:16:31

标签: c# .net gac distribution

我有一个使用dll的C#应用​​程序。当我尝试运行该应用程序时,它找不到该dll,除非它位于同一目录或GAC中。我不想将它放在同一目录中,我不想将它安装到GAC。 有没有办法告诉应用程序在哪里寻找库? (例如,如果我想将应用程序分发给客户,并且他们想要使用自己的应用程序来使用dll。)

添加了:

我想要这个文件结构:

MainFolder:图书馆,应用程序

库:lib.dll

应用程序:app1.exe

我不想将其复制到GAC或在文件夹应用程序中使用lib.dll。有可能吗?

7 个答案:

答案 0 :(得分:8)

我建议客户的应用程序将他们在自己目录中使用的dll复制。

VB6用于在应用程序之间共享dll,我们有一个术语:DLL Hell

答案 1 :(得分:6)

答案 2 :(得分:4)

在你的主要:

 AppDomain.CurrentDomain.AssemblyResolve += (s,e)=>{
    var filename = new AssemblyName(e.Name).Name;
    var path = string.format(@"C:\path\to\assembly\{0}.dll",  filename);
    return Assembly.LoadFrom(path);
 };

为该

添加一些异常处理

答案 3 :(得分:1)

DLL必须位于GAC或应用程序的目录或子目录中,因为您之前的问题的答案说明了。

如果您的客户想要使用DLL编写自己的应用程序,您应该将其安装在GAC中,或者让他们也复制DLL。拥有该库的多个副本并不像声音那样好,但它确实是:它意味着您可以将一个副本升级到另一个版本而不会破坏其他所有副本。

答案 4 :(得分:1)

没有GAC就可以,但程序集必须是强名称的,并且只要版本或publickeytoken发生更改,您就必须对app.config进行更改。这就是我所拥有的 \,共享库中的主程序\,共享库中的共享库。和我希望在\ SDK中分离的子程序,它使用.. \ Shared作为程序集。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="shared" />
      <dependentAssembly>
         <assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" />
         <codeBase version="1.0.0.282" href="../protobuf-net.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="SevenUpdate.Base" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.4.0" href="../SevenUpdate.Base.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="SharpBits.Base" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../SharpBits.Base.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.Windows" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../System.Windows.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="WPFLocalizeExtension" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../WPFLocalizeExtension.dll"/>
       </dependentAssembly>
    </assemblyBinding>
  </runtime>

答案 5 :(得分:0)

就像我在上一个问题的答案中所说:

在app.config或machine.config中使用Assembly Redirection说明。

答案 6 :(得分:0)

您可以记录,然后查看框架尝试加载程序集所采取的操作。这使得诊断装配负载错误非常容易。

两者兼而有之的工具是“FUSLOGVW.exe”(Fusion Log Viewer,Fusion是加载器的名称),并包含在SDK中。