如何模拟ReflectionTypeLoadException

本文关键字:ReflectionTypeLoadException 模拟 何模拟 | 更新日期: 2023-09-27 18:25:07

我有一个生产用户在尝试从Outlook互操作程序集获取程序集类型时,正在获取ReflectionTypeLoadException。我需要对应用程序进行编码以更好地调试问题,但我无法重现他的问题,因此我无法测试代码以确保它能满足我的需要。

我发现了这个帖子:错误消息';无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取详细信息';它有示例代码,但我想对它进行调试,以确保它对我有效,并看看它是如何工作的。

这是我抛出的代码。我已经加载了实际的程序集。当我枚举其中包含的类型时,我会得到异常:

Type t = assembly.GetTypes().Where(x => x.IsClass && x.Name.Equals("ApplicationClass")).FirstOrDefault();

有人能提供一个样本或一些关于我如何模拟这个问题的见解吗?这样我就可以验证我需要写的代码了?

谢谢。

如何模拟ReflectionTypeLoadException

我今天遇到了同样的问题。以下是我根据我过去遇到的一个案例得出的结论:

var assemblyName = new AssemblyName("TestAssembly");
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var module = assemblyBuilder.DefineDynamicModule("MainModule");
var typeBuilder = module.DefineType(name: "TestType", attr: TypeAttributes.Public | TypeAttributes.Class);
// uncommenting this stops the error. Basically, GetTypes() seems to fail if the ModuleBuilder
// has an "unfinished" type
//typeBuilder.CreateType();
module.Assembly.GetTypes();

似乎System.Reflection.Assembly的所有公共成员都是虚拟的,所以这样的东西可能适合您的目的:

public class DodgyAssembly : Assembly
{
    public override Type[] GetTypes()
    {
        throw new ReflectionTypeLoadException(new [] { typeof(Foo) }, new [] { new Exception() });
    }
}
var assembly = new DodgyAssembly();

在创建outlook类的实例时,是否有一个try块围绕它来获得堆栈?此外,应用程序是否作为客户端应用程序运行?如果是,用户可能没有安装outlook?

您应该能够抛出ReflectionTypeLoadException并使用它进行测试。显然,您可能应该为您的特定情况抛出一个更现实的示例,但这将模拟该异常类型。

try
{
    var test = 10;
    throw new ReflectionTypeLoadException(new Type[] { test.GetType() }, new Exception[] { new FileNotFoundException() });
}
catch (ReflectionTypeLoadException ex)
{
   var whatIsTheException = ex;
}
相关文章:
  • 没有找到相关文章