如何模拟ReflectionTypeLoadException
本文关键字:ReflectionTypeLoadException 模拟 何模拟 | 更新日期: 2023-09-27 18:25:07
我有一个生产用户在尝试从Outlook互操作程序集获取程序集类型时,正在获取ReflectionTypeLoadException
。我需要对应用程序进行编码以更好地调试问题,但我无法重现他的问题,因此我无法测试代码以确保它能满足我的需要。
我发现了这个帖子:错误消息';无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取详细信息';它有示例代码,但我想对它进行调试,以确保它对我有效,并看看它是如何工作的。
这是我抛出的代码。我已经加载了实际的程序集。当我枚举其中包含的类型时,我会得到异常:
Type t = assembly.GetTypes().Where(x => x.IsClass && x.Name.Equals("ApplicationClass")).FirstOrDefault();
有人能提供一个样本或一些关于我如何模拟这个问题的见解吗?这样我就可以验证我需要写的代码了?
谢谢。
我今天遇到了同样的问题。以下是我根据我过去遇到的一个案例得出的结论:
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;
}