我开发了一个控制台实用程序,可以对服务器应用程序执行某些操作。由于我正在使用的服务器应用程序的性质,我需要在服务器上执行此实用程序。
问题是该实用程序正在引用先前已部署到服务器的GAC的公共DLL。自从常见的DLL部署以来,它已经更新,我的实用程序依赖于这些更新。由于公司关于部署的政策,我无法更新GAC中的DLL。
默认情况下,我的实用程序将使用GAC中过时的DLL。有没有办法可以强制它使用更新的DLL(例如通过指定文件系统上的路径)?
答案 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>
元素