如何强制加载装配的位置?

时间:2009-02-23 15:57:27

标签: .net deployment assemblies assembly-resolution

我开发了一个控制台实用程序,可以对服务器应用程序执行某些操作。由于我正在使用的服务器应用程序的性质,我需要在服务器上执行此实用程序。

问题是该实用程序正在引用先前已部署到服务器的GAC的公共DLL。自从常见的DLL部署以来,它已经更新,我的实用程序依赖于这些更新。由于公司关于部署的政策,我无法更新GAC中的DLL。

默认情况下,我的实用程序将使用GAC中过时的DLL。有没有办法可以强制它使用更新的DLL(例如通过指定文件系统上的路径)?

6 个答案:

答案 0 :(得分:3)

更新的DLL没有新的版本号吗?我希望如果你强制引用使用正确的版本号,它应该选择本地版本。

答案 1 :(得分:3)

不幸的是,GAC倾向于使用王牌 - 但如果您更改了版本,那么GAC解析应该失败(只要您在IDE中将“特定版本”设置为true),允许它加载本地版?

答案 2 :(得分:2)

Assembly类有一些方法可以从特定位置加载程序集。

Assembly.LoadFrom有一些重载

编辑:有一种方法可以通过配置文件指定在哪里查找特定的程序集版本。我记不起来了。

答案 3 :(得分:1)

正如foson建议的那样,在控制台的配置文件中使用codebase。示例如下所示(适当更改publicKeyToken,名称,版本和href)。

<runtime> 
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
  <dependentAssembly> 
     <assemblyIdentity name="myCommonDll" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
     <codeBase version="2.0.0.0" href="file://C:\Users\djpiter\Documents/myCommon.dll"/>
  </dependentAssembly> 
 </assemblyBinding> 
</runtime> 

因此,这将是迫使CLR将调用从GAC调用到您的常用DLL到位于href位置的版本的最简单方法。您更新的常见dll应该具有强名称,就像GAC中具有相同名称,culture,publickeytoken但新版本的名称一样。因此,唯一的变化是在控制台的配置文件中。您无需在控制台的源代码中更改引用。您可以继续使用现有的控制台应用程序。

答案 4 :(得分:0)

您可能需要查看AppDomain.AssemblyResolve事件。

编辑:只有在常规程序集解析失败时才会触发事件,因此它不符合您的需求。

答案 5 :(得分:0)

尝试在app.config中使用<codebase>元素