需要加载特定组件的最新版本

时间:2010-11-10 19:52:02

标签: vb.net reflection assemblies gac

我遇到这种情况,其中LoadWithPartialName似乎是唯一的好选择,尽管它被标记为已废弃。

首先,请记住,我的工作环境非常紧凑,版本控制和部署策略无法轻易更改或绕过。

假设有一个我无法控制的.NET可执行文件(来自另一个部门)。我们称之为客户端AppA应用程序。 AppA的版本是10.11.12.x。

Application AppA直接引用我们的一个类库,它为调用者提供一些服务(返回一些信息)。我们称之为SvcB,版本也是10.11.12.x。

现在,AppA的部门不需要像我们一样经常更新他们的系统,因此AppA的版本将保留10.11.12.x一段时间,可能直到我们决定更改我们之间交换的类的格式

我们的部门需要更频繁地更改服务SvcB背后的逻辑,并且版本必须随着每个主要部署而改变。所以我们说我们改变了逻辑,并部署了新版本的SvcB,11.02.11.x。 AppA仍会引用旧版本,因此使用的逻辑现在不正确。

我们正在考虑为我们的服务创造一个新的“门面”。我们称之为SvcFrontB。 SvcFrontB的版本将保持不变,与AppA自己的版本同步。

现在我需要SvcFrontB通过反射加载最新版本的SvcB。这样,我确信始终使用最新的逻辑。

如何在不使用LoadWithPartialName的情况下实现这一目标?

由于 盖

2 个答案:

答案 0 :(得分:0)

从我下载的示例中,我现在意识到Fusion.dll是一个你真的不需要引用的API。我已经下载了样本GacTool(MSjogren.Fusion.Native)并且在项目中根本没有参考。

然而,那里的代码似乎有点复杂。有没有一种简单的方法可以获得GAC中所有版本的程序集列表?

例如,如果我可以获得GAC中所有SvcB的列表,该列表将包含两个程序集,版本10.11.12.x和版本11.02.11.x.然后我将能够决定哪一个是最新的并使用Assembly.Load命令加载它。

或许甚至可以使用Fusion API更直接地检索最新版本的程序集?

任何帮助表示赞赏! 感谢

答案 1 :(得分:0)

我发现了。

由于来自我将调用SvcB的DLL SvcFrontB也将在GAC中,我可以很容易地找到它的位置,因此也是GAC位置。

从那里,我使用Directory.GetFiles获取当前在GAC中的所有SvcB版本,并使用Diagnostics.FileVersionInfo.GetVersionInfo分析它们以找出最新版本。

由于我已经知道名称和PublicKeyToken,现在有完整版本,我可以做一个Assembly.Load。

进一步,为了测试目的(仅在开发环境中),我还将在App.Config中寻找一个键,指向我使用的确切DLL路径。通过将其与GAC中的结果进行比较,我将能够真正使用最新版本。

由于

相关问题