【发布时间】:2011-07-07 00:21:42
【问题描述】:
我有一个第三方库,当我调用他们的代码时,它需要加载程序集 A。该程序集通常安装在 GAC 中,因此我有几个选项可以加载它:
- 我可以显式调用
Assembly.Load()。但是,这需要全名,我不喜欢在我的程序中硬编码。 - 我可以显式调用
Assembly.LoadWithPartialName()。那当然是一个过时的 API,当然我对失去对版本控制的控制感到不舒服。 - 我可以在我的 Visual Studio 项目文件中引用程序集,所以我总是得到我构建的版本。但是,除非我在该程序集中创建一个虚拟对象,否则这将不起作用。如果我不这样做,C# 编译器会直接忽略它。
- 如果我调用
Assembly.GetReferencedAssemblies并强制加载匹配的,也会出现同样的问题。即使我将程序集放在引用列表中,C# 编译器也不会引用它。
现在我正在做的是调用typeof(A.Foo).Assembly.GetName() 并忽略返回值。有没有更好的方法?
【问题讨论】:
-
选项 #1 怎么样,但是将程序集全名放在 app.config(或其他类似的配置文件)中?这样您就可以两全其美:- 显式加载您想要的程序集,但如果您需要,无需重新编译即可灵活更新
-
@dkackman - 这也是我需要手动更新的东西。我希望 Visual Studio 从版本控制中获取当前版本,因此我在构建时获取版本,而不是在编码时或运行时获取。
-
@focey - 嗯,有一股鱼腥味,但是......构建后步骤?获取程序集,找出版本,写入配置文件?可能最好继续做你正在做的事情,虽然我也不喜欢那样