Activator.CreateInstance(type)引发异常

时间:2017-02-12 08:38:26

标签: c# uwp windows-10-universal .net-native

实际上这是一个非常奇怪的异常,因为只有当我将项目构建为发布时才会发生,并且当我选择调试时根本不会发生。在调试模式下,应用程序运行良好,以下代码运行良好。

以下是我的扩展程序代码:

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;
}

例外情况是:

  

类型&#39; System.MissingMethodException&#39;的例外情况发生在   System.Private.Reflection.Execution.dll但未在用户中处理   代码

     

其他信息:MissingConstructor_Name,   Windows.UI.Xaml.Controls.RelativePanel。有关更多信息,请访问   http://go.microsoft.com/fwlink/?LinkId=623485

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

1 个答案:

答案 0 :(得分:6)

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

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

在您的UWP项目的属性文件夹中有一个名为default.rd.xml的文件。打开它并在<Applications>元素中添加以下行:

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

Dynamic属性应确保可以进行反射,Activate属性应确保构造函数可用于激活 - 这对您的案例至关重要。

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

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