C# 如何模拟ReflectionTypeLoadException?

C# 如何模拟ReflectionTypeLoadException?,c#,exception,outlook,.net-assembly,C#,Exception,Outlook,.net Assembly,我有一个在生产环境中的用户,在尝试从Outlook interop程序集获取程序集类型时,正在获取ReflectionTypeLoadException。我需要编写应用程序以更好地调试问题,但我无法重现他的问题,因此我无法测试代码以确保它能满足我的需要 我找到了这篇文章:它有示例代码,但我想调试一下,以确保它对我有用,并看看它是如何工作的 这是我抛出的代码。我已经加载了实际的程序集。当我枚举其中包含的类型时,我得到异常: Type t = assembly.GetTypes().Where(x

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

我找到了这篇文章:它有示例代码,但我想调试一下,以确保它对我有用,并看看它是如何工作的

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

Type t = assembly.GetTypes().Where(x => x.IsClass && x.Name.Equals("ApplicationClass")).FirstOrDefault();
有没有人能提供一个示例或一些见解,让我了解如何模拟这个问题,以便验证我需要编写的代码


谢谢。

在创建outlook类的实例时,是否在其周围有一个try块来获取stacktrace?此外,应用程序是否作为客户机应用程序运行?如果是这样,用户可能没有安装outlook?

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

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

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

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

我现在没有机会试一试。我需要添加一个,但我想专门记录/跟踪可以从ReflectionTypeLoadException收集的信息。因为我无法在我的机器上重现问题,所以我无法评估我的代码以确保我捕获了我需要的东西,我也很好奇,所以看看这种特定的反射类型提供了什么。用户确实安装了outlook。请查看此处以查看我已查看的所有属性。我可以编写大量代码来从异常中提取所有需要的信息,但我不能做的是触发其中一个异常,以便验证我的代码。我无法重现这个问题,所以我正在寻找一种方法。我也没有权限创建可以在用户机器上运行的用于测试的示例应用程序。我如何创建一个有bug的程序集,以便对其调用GetTypes会引发此异常。我可以这样做,但我想模拟一个真实的示例,其中ReflectionTypeLoadException作为真正的异常而不是代码生成的异常引发。在试图通过反射一种猜测是,它无法在类型加载器中找到您要查找的文件。