11

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

添加:

我想要这个文件结构:

MainFolder:库,应用程序

库:lib.dll

应用程序:app1.exe

我不想将它复制到 GAC 或在文件夹 Applications 中包含 lib.dll。可能吗?

4

7 回答 7

8

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

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

于 2009-03-10T11:21:35.853 回答
6

遵循MSDN 上的此指南:指定程序集的位置

于 2009-03-10T11:18:10.197 回答
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);
 };

添加一些异常处理

于 2009-03-10T11:39:30.927 回答
1

正如您之前问题的答案所说,该 DLL 必须位于 GAC 或应用程序的目录或子目录中。

如果您的客户想要使用 DLL 编写他们自己的应用程序,您应该将其安装在 GAC 中或让他​​们也复制 DLL。拥有库的多个副本听起来不是一件好事,但它确实是:这意味着您可以将一个副本升级到不同的版本而不会破坏其他所有内容。

于 2009-03-10T11:22:44.773 回答
1

没有 GAC 也是可能的,但程序集必须是强命名的,并且您必须在版本或 publickeytoken 更改时对 app.config 进行更改。这就是我在 \ 中的主程序,在 \Shared 中的共享库。和一个我想在 \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>
于 2011-05-06T06:48:37.123 回答
0

就像我在回答您上一个问题时所说的那样:

在 app.config 或 machine.config 中使用程序集重定向说明。

于 2009-03-10T11:20:44.467 回答
0

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

执行这两个操作的工具是“FUSLOGVW.exe”(Fusion Log Viewer,Fusion 是加载程序的名称)并包含在 SDK 中。

于 2009-03-10T11:31:10.323 回答