这不是我在自己的开发机器上遇到的问题或者曾经能够重现的问题,但我从最终用户那里得到了很多关于这个问题的崩溃日志,我不知道是什么引起它。
问题在于,对于一小部分用户,当我的应用程序在某些系统程序集上调用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...
}