我有一个库模块,我们在所有Web应用程序中使用它们将所有已加载的程序集(及其版本号)列入ASP.NET webforms应用程序的Application_Start
方法中的log4net日志文件中
这已经完美无缺 - 直到今天,当我尝试使用“应用程序预热”方法(由Scott Guthrie in his blog post描述在部署到IIS之后运行(和之前)之后) ASP.NET的Application_Start
曾经运行过 - 现在我突然收到错误:
System.NotSupportedException:动态程序集中不支持调用的成员。
报告加载的程序集的代码如下所示:
public static void ReportLoadedAssemblies(this ILog log)
{
if (log.IsInfoEnabled)
{
log.Info("Loaded assemblies:");
IEnumerable<Assembly> appAssemblies = AppDomain.CurrentDomain.GetAssemblies().OrderBy(c => c.ManifestModule.Name);
foreach (Assembly asm in appAssemblies)
{
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(asm.Location);
if (!fvi.CompanyName.Contains("Microsoft"))
{
log.Info(String.Format("{0, -45} : {1, -15} {2}", fvi.FileDescription, fvi.FileVersion, asm.Location));
}
}
}
}
我不是100%清楚哪一行确切地引发错误 - 我怀疑就是这一行:
IEnumerable<Assembly> appAssemblies = AppDomain.CurrentDomain.GetAssemblies().OrderBy(c => c.ManifestModule.Name);
所以这条消息究竟是什么告诉我的?在这种情况下,我怎样才能获得装载的装配?
答案 0 :(得分:2)
我认为错误不在
IEnumerable<Assembly> appAssemblies = AppDomain.CurrentDomain.GetAssemblies().OrderBy(c => c.ManifestModule.Name);
因为在动态生成程序集时访问Assembly.Location
属性会抛出NotSupportedException
。
那么这条消息究竟告诉了我什么?
动态生成的程序集没有任何位置,因此您无法访问该属性。是的,它可能会返回一个空字符串,但它会与使用Assembly.Load()
创建的程序集相同...严重我无法理解这个选择的理由,但就是这样。
在这种情况下,我怎样才能获得装载的装配?
只需检查一下:
foreach (Assembly asm in appAssemblies.Where(x => !x.IsDynamic))
{
// Your code
}
或者更容易:
var appAssemblies = AppDomain.CurrentDomain.GetAssemblies()
.Where(x => !x.IsDynamic)
.OrderBy(c => c.ManifestModule.Name);