【问题标题】:How should I force load a referenced assembly?我应该如何强制加载引用的程序集?
【发布时间】:2011-07-07 00:21:42
【问题描述】:

我有一个第三方库,当我调用他们的代码时,它需要加载程序集 A。该程序集通常安装在 GAC 中,因此我有几个选项可以加载它:

  1. 我可以显式调用Assembly.Load()。但是,这需要全名,我不喜欢在我的程序中硬编码。
  2. 我可以显式调用Assembly.LoadWithPartialName()。那当然是一个过时的 API,当然我对失去对版本控制的控制感到不舒服。
  3. 我可以在我的 Visual Studio 项目文件中引用程序集,所以我总是得到我构建的版本。但是,除非我在该程序集中创建一个虚拟对象,否则这将不起作用。如果我不这样做,C# 编译器会直接忽略它。
  4. 如果我调用Assembly.GetReferencedAssemblies 并强制加载匹配的,也会出现同样的问题。即使我将程序集放在引用列表中,C# 编译器也不会引用它。

现在我正在做的是调用typeof(A.Foo).Assembly.GetName() 并忽略返回值。有没有更好的方法?

【问题讨论】:

  • 选项 #1 怎么样,但是将程序集全名放在 app.config(或其他类似的配置文件)中?这样您就可以两全其美:- 显式加载您想要的程序集,但如果您需要,无需重新编译即可灵活更新
  • @dkackman - 这也是我需要手动更新的东西。我希望 Visual Studio 从版本控制中获取当前版本,因此我在构建时获取版本,而不是在编码时或运行时获取。
  • @focey - 嗯,有一股鱼腥味,但是......构建后步骤?获取程序集,找出版本,写入配置文件?可能最好继续做你正在做的事情,虽然我也不喜欢那样

标签: c# .net


【解决方案1】:

对我来说,选项 1 是在 VS 项目中引用它。

但如果您想要更被动的方法,您可以使用 AppDomain.CurrentDomain.AssemblyResolve 事件处理程序。它在需要在 AppDomain 中找不到的程序集时执行。事件 args 将告诉您正在寻找的程序集,您可以在此时使用 Assembly.Load() 获取它

【讨论】:

  • 谢谢 - 不幸的是,第 3 方库调用 AppDomain.CurrentDomain.GetAssemblies() 并在找不到所需的库时抛出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2011-01-23
相关资源
最近更新 更多