我开发了一个控制台实用程序,可以对服务器应用程序执行一些操作。由于我正在使用的服务器应用程序的性质,我需要在服务器上执行此实用程序。
问题是该实用程序引用了以前部署到服务器 GAC 的通用 DLL。自通用 DLL 部署以来,它已经更新,我的实用程序依赖于这些更新。由于公司有关部署的政策,我无法更新 GAC 中的 DLL。
默认情况下,我的实用程序将使用 GAC 中过时的 DLL。有没有办法强制它使用更新的 DLL(例如,通过在文件系统上指定路径)?
我开发了一个控制台实用程序,可以对服务器应用程序执行一些操作。由于我正在使用的服务器应用程序的性质,我需要在服务器上执行此实用程序。
问题是该实用程序引用了以前部署到服务器 GAC 的通用 DLL。自通用 DLL 部署以来,它已经更新,我的实用程序依赖于这些更新。由于公司有关部署的政策,我无法更新 GAC 中的 DLL。
默认情况下,我的实用程序将使用 GAC 中过时的 DLL。有没有办法强制它使用更新的 DLL(例如,通过在文件系统上指定路径)?
更新的DLL没有新的版本号吗?我希望如果您强制引用使用正确的版本号,它应该选择本地版本号。
不幸的是,GAC 倾向于打一张王牌——但如果您更改了版本,那么 GAC 解析应该会失败(只要您在 IDE 中将“特定版本”设置为 true),允许它加载本地版本吗?
Assembly 类有一些方法可以从特定位置加载程序集。
Assembly.LoadFrom
有一些重载
编辑:有一种方法可以通过配置文件指定在哪里查找特定的程序集版本。我记不清了。
正如 foson 建议的那样,在控制台的配置文件中使用代码库。示例如下所示(适当更改 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 中的一样具有强名称,具有相同的名称、文化、publickeytoken 但新版本。因此,唯一的变化是在控制台的配置文件中。您无需更改控制台源代码中的引用。您可以简单地继续使用现有的控制台应用程序。
您可能想查看AppDomain.AssemblyResolve事件。
编辑:仅当常规程序集解析失败时才会触发该事件,因此它不符合您的需求。
<codebase>
尝试在 app.config 中使用元素