2017-02-12 194 views
3

其實這是很奇怪的例外,因爲它發生,只有當我建立以項目爲發佈,並在所有的時候,我選擇調試不會發生。在調試模式下,應用程序完美工作,以下代碼運行良好。Activator.CreateInstance(類型)拋出異常

這裏是我的擴展方法的代碼:

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但在我的應用程序沒有任何改變。

+1

不相關,但當結果可能不是'T'類型時,'T'很有用。功能方面,'x as T'意思是'x是T? (T)x:null',除了'x'只被評估一次。你知道'x是T'必然總是真的,並且在某種程度上你犯了一個錯誤的情況下,得到一個異常立即使得調試比在CopyProperties內的某個'NullReferenceException'更容易調試。因此,我推薦'(T)Activator.CreateInstance(type)'。 – hvd

回答

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上看到更多的細節。

+0

謝謝,其實我試過你的修復,乾淨的解決方案和構建(發佈),但不幸的是仍然得到相同的。 –

+0

然後我會建議嘗試做一個虛擬的方法,它只會創建一個'RelativePanel'('New RelativePanel()')的實例,並且可能調用一個方法或設置一個屬性。然後在Release中重新編譯,看看現在類型是否存在。 –

+0

我已經用另一個屬性更新了我的答案,它應該可以解決您的問題:-) - Activate屬性。 –

相關問題