如何强制加载引用的程序集?

7

我有一个第三方库,当我调用他们的代码时需要加载程序集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
@dkackman - 这也是我需要手动更新的东西。我希望Visual Studio能够从版本控制中获取当前版本,这样我就可以在构建时获取版本,而不是在编码或运行时获取。 - Todd Li
@focey - 嗯,有点可疑,但是...后构建步骤?获取程序集,查找版本,写入配置文件?最好还是继续做你正在做的事情,虽然我也不喜欢那样做。 - dkackman
1个回答

1

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

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


1
谢谢 - 不幸的是,第三方库调用了 AppDomain.CurrentDomain.GetAssemblies() 并会抛出异常,如果所需的程序集未找到。 - Todd Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接