通过配置加载相关的程序集

时间:2018-08-24 11:57:18

标签: c# visual-studio deployment frameworks

我有一个Visual Studio项目,运行得很好。 但是部署时出现了新的客户端要求,即将不同的dll放置在不同的文件夹中。

我们有一个可以在不同项目中使用的框架dll。此框架dll依赖于某些第三方dll。因此,当我从项目中使用此dll时,由于CopyLocal属性为true,因此每个相关的dll都将复制到本地版本中。

但是现在有了新的要求,我们不能将CopyLocal属性设置为True。客户端不需要任何dll的本地副本,而希望在某个位置获得与框架相关的dll。当我这样做时,依赖的DLL不会被破坏。

我知道我有两个选择:

  1. 我可以将它们放在GAC中,但是我不想这样做,因为我希望它们支持xcopy。
  2. 使用反思(但我不确定这是正确的方法)

我们可以使用配置做任何事情吗?

1 个答案:

答案 0 :(得分:0)

您可以使用<probing> configuration element配置程序集探测路径:

  

指定公共语言运行库的应用程序基本子目录,以便在加载程序集时进行搜索。

来自MSDN的示例:

<configuration>  
   <runtime>  
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
         <probing privatePath="bin;bin2\subbin;bin3"/>  
      </assemblyBinding>  
   </runtime>  
</configuration>  

但是,如果有问题的程序集位于应用程序库之外(“这是正在执行应用程序的根位置”),则您将拥有<codeBase> configuration element

  

指定公共语言运行库在哪里可以找到程序集。

来自MSDN的示例:

<configuration>  
   <runtime>  
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">  
         <dependentAssembly>  
            <assemblyIdentity name="myAssembly"  
                              publicKeyToken="32ab4ba45e0a69a1"  
                              culture="neutral" />  
            <codeBase version="2.0.0.0"  
                      href="http://www.litwareinc.com/myAssembly.dll"/>  
         </dependentAssembly>  
      </assemblyBinding>  
   </runtime>  
</configuration>  

有关运行时如何定位程序集的确切详细信息,请参见this MSDN article

正如OP所指出的,不幸的是, codeBase 元素仅是强命名程序集的可用选项。对于私有程序集,您需要一种解决方法。 in this discussion可以找到一些可行的想法,例如:

我已经测试了后者,并可以确认它是否有效:

AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
    Assembly.LoadFile(Path.Combine(Settings.Default.AssemblyPath, Path.ChangeExtension(e.Name.Substring(0, e.Name.IndexOf(',')), ".dll")));