如何模拟ReflectionTypeLoadException?

时间:2013-07-26 13:16:58

标签: c# exception outlook .net-assembly

我在生产中有一个用户在尝试从Outlook互操作程序集中获取程序集类型时获得ReflectionTypeLoadException。我需要编写应用程序代码以更好地调试问题,但我无法重现他的问题所以我无法测试代码以确保它给我我需要的东西。

我发现这篇文章:Error message 'Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.'有示例代码,但我想通过它进行调试,以确保它对我有用并了解它是如何工作的。

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

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

任何人都可以提供样本或深入了解我如何模拟此问题,以便验证我需要编写的代码吗?

感谢。

4 个答案:

答案 0 :(得分:2)

我今天遇到了同样的问题。以下是我提出的建议,基于过去我遇到过这种情况的一个案例:

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();

答案 1 :(得分:1)

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

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

var assembly = new DodgyAssembly();

答案 2 :(得分:0)

在您创建outlook类的实例时,是否有一个try块来获取堆栈跟踪?此外,该应用程序是否作为客户端应用程序运行?如果是这样,用户可能没有安装Outlook?

答案 3 :(得分:0)

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

try
{
    var test = 10;
    throw new ReflectionTypeLoadException(new Type[] { test.GetType() }, new Exception[] { new FileNotFoundException() });
}
catch (ReflectionTypeLoadException ex)
{
   var whatIsTheException = ex;
}