Activator.CreateInstance(type) 抛出异常

Activator.CreateInstance(type) Throws Exception

实际上这是一个非常奇怪的异常,因为它只在我将项目构建为 Release 时发生,而当我选择 Debug[= 时根本不会发生26=]。在调试模式下,应用程序运行完美,以下代码运行良好。

下面是我的扩展方法的代码:

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

例外情况是:

An exception of type 'System.MissingMethodException' occurred in System.Private.Reflection.Execution.dll but was not handled in user code

Additional information: MissingConstructor_Name, Windows.UI.Xaml.Controls.RelativePanel. For more information, visit http://go.microsoft.com/fwlink/?LinkId=623485

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

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

幸运的是,this blogpost.

中描述了解决此问题的方法

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

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

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

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

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