【发布时间】:2012-07-25 22:26:06
【问题描述】:
我想使用反射在 GAC 中动态加载最新安装的程序集版本。
到目前为止,我已经找到了多种工作方法来实现这一点,但它们都有其特定的缺点。
最简单的解决方案是使用Assembly.LoadWithPartialName() 方法。但是这种方法在 .NET Framework 2 之后就已经过时了:
var assembly = Assembly.LoadWithPartialName("Microsoft.WindowsAzure.ServiceRuntime");
另一种可能性是使用Assembly.Load()(按照过时警告的建议)并在 try/catch 块中使用其完全限定的程序集名称调用不同的程序集版本,以获取最新的安装版本。这需要维护,而且看起来很脏:
Assembly assembly = null;
try
{
assembly = Assembly.Load("Microsoft.WindowsAzure.ServiceRuntime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
}
catch (FileNotFoundException) { }
try
{
assembly = Assembly.Load("Microsoft.WindowsAzure.ServiceRuntime, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
}
catch (FileNotFoundException) { }
最后但并非最不重要的一点是another solution 我在这里找到了使用Assembly.LoadFrom() 方法然后基本上导入程序集管理器模块fusion.dll 来确定最新版本的路径。对于这样一个“简单”的任务来说,这似乎太过分了。
如果不使用过时的方法、使用魔法字符串或调用非托管代码创建维护地狱,难道没有更好的解决方案来实现这一点吗?
提前致谢!
【问题讨论】:
-
Assembly.LoadFrom() 怎么样?
-
是的,这是第三种解决方案。但它需要 fusion.dll 来确定 GAC 中最新版本的路径。
标签: c# .net gac .net-assembly system.reflection