尝试从系统程序集加载类型时的ReflectionTypeLoadException

时间:2018-03-24 21:02:19

标签: .net reflection

这不是我在自己的开发机器上遇到的问题或者曾经能够重现的问题,但我从最终用户那里得到了很多关于这个问题的崩溃日志,我不知道是什么引起它。

问题在于,对于一​​小部分用户,当我的应用程序在某些系统程序集上调用Assembly.GetTypes()时(总是内置于.NET的系统程序集,但不同用户的不同程序集),它会崩溃一个带有看似乱码的ReflectionTypeLoadException

System.Reflection.ReflectionTypeLoadException: Ре ÑƒÐ´Ð°ÐµÑ‚Ñ Ñ  загрузить один или более запрошенных типов. ÐžÐ±Ñ€Ð°Ñ‚Ð¸Ñ‚ÐµÑ ÑŒ к Ñ Ð²Ð¾Ð¹Ñ Ñ‚Ð²Ñƒ LoaderExceptions Ð´Ð»Ñ  Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ  дополнительных Ñ Ð²ÐµÐ´ÐµÐ½Ð¸Ð¹.
    в System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
    в System.Reflection.Assembly.GetTypes()
    [my code]

打印出LoaderExceptions属性始终指向系统程序集作为罪魁祸首,但不提供任何其他有用信息。 (同样,特定程序集似乎从用户更改为用户。)以下是打印出从单个ReflectionTypeLoadException检索到的所有加载程序异常时得到的输出示例:

Ре ÑƒÐ´Ð°Ð»Ð¾Ñ ÑŒ загрузить файл или Ñ Ð±Ð¾Ñ€ÐºÑƒ "System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" либо одну из их Ð·Ð°Ð²Ð¸Ñ Ð¸Ð¼Ð¾Ñ Ñ‚ÐµÐ¹. Ре ÑƒÐ´Ð°ÐµÑ‚Ñ Ñ  найти указанный файл.
Ре ÑƒÐ´Ð°Ð»Ð¾Ñ ÑŒ загрузить файл или Ñ Ð±Ð¾Ñ€ÐºÑƒ "System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" либо одну из их Ð·Ð°Ð²Ð¸Ñ Ð¸Ð¼Ð¾Ñ Ñ‚ÐµÐ¹. Ре ÑƒÐ´Ð°ÐµÑ‚Ñ Ñ  найти указанный файл.
Ре ÑƒÐ´Ð°Ð»Ð¾Ñ ÑŒ загрузить файл или Ñ Ð±Ð¾Ñ€ÐºÑƒ "System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" либо одну из их Ð·Ð°Ð²Ð¸Ñ Ð¸Ð¼Ð¾Ñ Ñ‚ÐµÐ¹. Ре ÑƒÐ´Ð°ÐµÑ‚Ñ Ñ  найти указанный файл.
Ре ÑƒÐ´Ð°Ð»Ð¾Ñ ÑŒ загрузить файл или Ñ Ð±Ð¾Ñ€ÐºÑƒ "System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" либо одну из их Ð·Ð°Ð²Ð¸Ñ Ð¸Ð¼Ð¾Ñ Ñ‚ÐµÐ¹. Ре ÑƒÐ´Ð°ÐµÑ‚Ñ Ñ  найти указанный файл.
Ре ÑƒÐ´Ð°Ð»Ð¾Ñ ÑŒ загрузить файл или Ñ Ð±Ð¾Ñ€ÐºÑƒ "System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" либо одну из их Ð·Ð°Ð²Ð¸Ñ Ð¸Ð¼Ð¾Ñ Ñ‚ÐµÐ¹. Ре ÑƒÐ´Ð°ÐµÑ‚Ñ Ñ  найти указанный файл.

同样,文字奇怪地出现乱码。知道发生了什么事吗?知道怎么调试这个吗?

以下是我的程序中调用Assembly.GetTypes()的代码:

        foreach(Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            Type[] types;
            try
            {
                types = assembly.GetTypes();
            }
            catch(ReflectionTypeLoadException ex)
            {
                Logger.LogError("Error getting types from assembly: " + assembly.FullName);
                Logger.LogError("LoaderExceptions:");
                foreach(Exception ex2 in ex.LoaderExceptions)
                    Logger.LogError("\t" + ex2.Message);
                throw;
            }

            // Do stuff with the loaded types...
        }

0 个答案:

没有答案
相关问题