C# 无法从Activator.CreateInstance捕获异常
好吧,我承认这段代码在你看来很奇怪,那是因为它很奇怪。这只是复制行为的代码,而不是我想要使用的代码C# 无法从Activator.CreateInstance捕获异常,c#,.net,exception-handling,activator,C#,.net,Exception Handling,Activator,好吧,我承认这段代码在你看来很奇怪,那是因为它很奇怪。这只是复制行为的代码,而不是我想要使用的代码 class Program { static void Main(string[] args) { try { Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero }); }
class Program
{
static void Main(string[] args)
{
try
{
Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero });
}
catch
{
Console.WriteLine("This won't print!");
}
Console.Write("Actually this will not print either!");
Console.ReadLine();
}
}
类程序
{
静态void Main(字符串[]参数)
{
尝试
{
CreateInstance(typeof(Func),新对象[]{new object(),IntPtr.Zero});
}
抓住
{
WriteLine(“这不会打印!”);
}
编写(“实际上这也不会打印!”);
Console.ReadLine();
}
}
无论我试图捕获何种异常类型(据我所知,实际抛出的异常是ArgumentException),catch块内的代码都不会执行。实际上,执行将在Activator.CreateInstance行停止。当我在.NET 3.5中运行此代码时,我得到一个
ExecutionEngineeException
。当运行时抛出此异常时,类似于调用Environment.FailFast
。显然,这是堆内存损坏的症状
当我将示例代码切换到以下代码时,就实现了正确的行为
Activator.CreateInstance(
typeof(Func<int>),
new object[] { IntPtr.Zero, new object() }
);
Activator.CreateInstance(
类型(Func),
新对象[]{IntPtr.Zero,new object()}
);
我很清楚,这带来的问题比答案多……:) 你用这段代码轰炸了CLR。给人印象深刻的实际的灾难是垃圾收集堆的损坏,它会发出ExecutionEngineeException信号。显然,损害的程度足以阻止CLR执行异常处理程序
您可以在connect.microsoft.com上报告此情况。然而,这个错误在.NET4.0中已经修复,它生成了正确的异常ArgumentNullException,“Value不能为null,Parameter name:method”。解决方法很明显,当IntPtr.Zero需要一个非空字符串时,不要传递它。只有在构造委托时才会发生这种情况吗?你应该使用
Delegate.CreateDelegate
来实现这一点。这可能只发生在构造委托时,但实际使用的代码不知道它试图创建的是什么类型,现在的修复方法是它是“禁止的”即使类型继承自委托,也要尝试。我根本无法捕获异常并检查它,您有什么设置来实现此目的?@Patrik-您正在运行.NET的哪个版本?@Patrik-您可能想查看在调试->异常下设置的选项。@chaosption,是的,我检查了“抛出”适用于所有类型的异常,但无论如何都不会中断。不确定我是否遗漏了其他设置???@Patrik-这只是一个理论,但请尝试将(Exception ex)
添加到您的catch
子句中。