3

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

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

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

4

6 回答 6

3

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

于 2009-02-23T16:01:12.950 回答
3

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

于 2009-02-23T16:01:54.227 回答
2

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

Assembly.LoadFrom有一些重载

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

于 2009-02-23T16:01:10.300 回答
1

正如 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 但新版本。因此,唯一的变化是在控制台的配置文件中。您无需更改控制台源代码中的引用。您可以简单地继续使用现有的控制台应用程序。

于 2011-12-08T22:00:56.873 回答
0

您可能想查看AppDomain.AssemblyResolve事件。

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

于 2009-02-23T16:00:31.300 回答
0

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

于 2009-02-23T16:09:35.223 回答