Activator.CreateInstance(type) 抛出异常

Posted

技术标签:

【中文标题】Activator.CreateInstance(type) 抛出异常【英文标题】:Activator.CreateInstance(type) Throws Exception 【发布时间】:2017-02-12 08:38:26 【问题描述】:

其实这是一个很奇怪的异常,因为只有当我将项目构建为Release时才会发生,而当我选择Debug时根本不会发生。在调试模式下,应用运行良好,以下代码运行良好。

这是我的扩展方法的代码:

public static T DeepClone<T>(this T source) where T : UIElement

   T result;

   // Get the type
   Type type = source.GetType();

   // Create an instance
   result = Activator.CreateInstance(type) as T; //throws exception here only if I build project as (release)

   CopyProperties<T>(source, result, type);
   DeepCopyChildren<T>(source, result);

   return result;

例外情况是:

“System.MissingMethodException”类型的异常发生在 System.Private.Reflection.Execution.dll 但未在用户中处理 代码

附加信息:MissingConstructor_Name, Windows.UI.Xaml.Controls.RelativePanel。如需更多信息,请访问 http://go.microsoft.com/fwlink/?LinkId=623485

我发现了一些与此异常相关的问题,但它们都指向缺少库或更新库,例如 this,但没有更改我的应用程序中的任何内容。

【问题讨论】:

不相关,但当结果可能不是 T 类型时,as T 很有用。在功能方面,x as T 表示 x is T ? (T) x : null,除了 x 只评估一次。你知道x is T 必然总是正确的,并且万一你在某处犯了错误,立即获得异常比CopyProperties 内部某处的NullReferenceException 更容易调试。因此,我推荐(T) Activator.CreateInstance(type) 【参考方案1】:

此问题与 UWP 应用的 Release 版本使用 .NET 本机工具链有关。在这种模式下,反射需要一些提示才能正常工作。显然RelativePanel 的构造函数不能用于反射。

幸运的是,this blogpost 中描述了一个解决方法。

在 UWP 项目的 Properties 文件夹中有一个名为 default.rd.xml 的文件。打开它并在&lt;Applications&gt; 元素中添加以下行:

<Type Name="Windows.UI.Xaml.Controls.RelativePanel" 
      Dynamic="Required All" Activate="Required All" /> 

Dynamic 属性应确保反射是可能的,Activate 属性应确保构造函数可用于激活 - 这是您的案例的关键。

这应该包括RelativePanel 的所有成员以进行反思,并且一切都应该按预期工作。

您可以查看default.rd.xml文件结构here的更多详细信息。

【讨论】:

谢谢,实际上我尝试了您的修复、清理解决方案和构建(发布),但不幸的是还是一样。 那么我建议尝试创建一个虚拟方法,它只会创建一个RelativePanel (new RelativePanel()) 的实例,并且可能会调用一个方法或在其上设置一个属性。然后在 Release 中重新编译,看看该类型现在是否存在。 太完美了,非常感谢,在添加(激活)之后,我在相关面板(图像、椭圆......等)内的每个控件/元素都有例外,然后添加了所有相同的内容RelativePanel,然后问题解决了:) 太棒了:-D!使用Namespace 属性可能可以添加整个命名空间,因此您可以节省一些时间和维护:-)。 您还可以使用指令的子类型版本将策略应用于给定类型的所有子类型。

以上是关于Activator.CreateInstance(type) 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

笔记 Activator.CreateInstance(Type)

Activator.CreateInstance(type) 抛出异常

Activator.CreateInstance - 如何创建具有参数化构造函数的类的实例

ProtoBuf-net AsReference 需要 Activator.CreateInstance 中的公共构造函数?

使用 Activator.CreateInstance() 创建的对象不会等待整个对象在 Release 上初始化

C# Activator.CreateInstance 动态创建类的实例