Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为应用程序设置C#库路径?_C#_.net_Gac_Distribution - Fatal编程技术网

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

如何为应用程序设置C#库路径?,c#,.net,gac,distribution,C#,.net,Gac,Distribution,我有一个使用dll的C#应用程序。当我尝试运行应用程序时,它无法找到dll,除非它位于同一目录或GAC中。我不想把它放在同一个目录中,也不想把它安装到GAC上。 有没有办法告诉应用程序在哪里可以找到库?(例如,如果我想将应用程序分发给客户,而他们想使用自己的应用程序,这些应用程序将使用dll。) 增加: 我希望具有以下文件结构: 主文件夹:库、应用程序 库:lib.dll 应用程序:app1.exe 我不想将其复制到GAC或在文件夹应用程序中使用lib.dll。有可能吗?就像我在回答你之前的问题

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

增加:

我希望具有以下文件结构:

主文件夹:库、应用程序

库:lib.dll

应用程序:app1.exe


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

就像我在回答你之前的问题时说的那样:


使用app.config或machine.config中的说明。

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


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

dll必须位于GAC中,或者位于应用程序的目录或子目录中,正如您前面问题的答案所述


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

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

两者都可以使用的工具是“FUSLOGVW.exe”(Fusion日志查看器,Fusion是加载程序的名称),并包含在SDK中。

在您的主应用程序中:

 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);
 };

添加一些异常处理

在没有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>


Tamara,您还可以编辑之前的问题。塔玛拉,这个问题很像这个问题,这和复制到GAC基本上是一样的吗?不,它们在概念上是不同的。您甚至可以通过此方法将安装在GAC中的程序集重新路由到另一个版本。您必须编辑机器配置或将DLL放入子目录。我怀疑它们中的任何一个都是您想要的,但正如GvS和Jon指出的,这通常不是一件好事。请使用更现代的术语来表示“DLL地狱”-->全局程序集缓存。=)我认为微软在制作GAC时的用意是好的(“通往地狱的路是……”),但感觉还是老样子。。。应用程序怪异、功能缺失、额外部署步骤等。谢谢;在我的例子中,我们的用户都安装了特定的产品SDK,我们大致知道库在哪里。AssemblyResolve事件处理程序正是我所需要的。