ASP.NET 4.5应用程序预热会导致错误确定加载的程序集

时间:2016-01-15 13:54:43

标签: webforms assemblies asp.net-4.5 application-warmup

我有一个库模块,我们在所有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);

所以这条消息究竟是什么告诉我的?在这种情况下,我怎样才能获得装载的装配?

1 个答案:

答案 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);