簡體   English   中英

System.Exception在InitializeComponent()中?

[英]System.Exception in InitializeComponent()?

我有一個奇怪的問題正在導致我們出現問題。

我們有一個簡單的C#Wpf UserControl。 它的進度條-沒什么花哨的-只是一個邊框,邊框根據與Value和MaxValue的綁定而改變大小。 它可以在99%的時間內正常工作,我們在十幾個地方(包括初始屏幕)在代碼外使用它。

它在啟動屏幕中始終可以正常工作-因此它始終可以在我們的應用中加載並正常工作。

問題在於進度條構造函數中的InitializeComponent()調用有時(並且我們無法預測或理解何時)拋出System.Exception。 查看在編譯過程中創建的progressbar.g.cs文件(obj / Debug文件夾),我可以看到由於未找到progressbar.xaml文件而引發了異常。 當然,我沒有更改g.cs文件中的任何代碼,並且在此UserControl中根本沒有做任何花哨的事情。

System.Exception: The component 'MyProject.ControlLibrary.ProgressBar' does not have a resource identified by the URI '/MyProject.ControlLibrary;component/progressbar.xaml'. at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) at MyProject.ControlLibrary.ProgressBar.InitializeComponent() in d:\\Projectfolder\\MyProject.ControlLibrary\\ProgressBar.xaml:line 1 at MyProject.ControlLibrary.ProgressBar..ctor() in D:\\projectfolder\\MyProject.ControlLibrary\\ProgressBar.xaml.cs:line 26 at ProjectName.UI.VideoViewer..ctor() in D:\\projectfolder\\UI\\VideoViewer.xaml.cs:line 26 Source: PresentationFramework

我不明白為什么有時會丟失progressbar.xaml資源,尤其是考慮到運行該應用程序時,它總是至少可以正常工作一次。

UserControl包含在一個名為MyProject.ControlLibrary.dll的項目中。 該項目似乎已正確配置,因為它包含其他用戶控件,這些控件未顯示任何問題-除了另一個存在相同問題的類似UserControl之外。

我對此沒有足夠的想法,因此任何建議都將有所幫助。 我正在使用VisualStudio 2008和.net 3.5

這篇帖子似乎是對該問題的最佳討論。 簡短的答案表明您的用戶控件可能已加載到兩個不同的程序集中。 長的答案是,有很多人都遇到了該錯誤,尚不清楚他們是否找到一致的解決方案/解決方法。 一位人士說,MS可能已在4.0中解決了該問題。

可能已經解決了這個問題-如果有人遇到它,我將在這里解釋問題。

我們代碼的一部分從plugins文件夾動態加載插件。 為此,它將對plugins文件夾中的所有.dll文件執行Assembly.LoadFile(filename)。

它檢查dll是否實現了我們的插件接口; 如果有,它將加載它;如果沒有,則不會加載。 我們的插件接口包含在一個名為MyProject.Interfaces.dll的文件中,該文件以及MyProject.ControlLibrary.dll也位於插件的文件夾中。

因此,代碼有時會在插件文件夾中的dll之間循環時,兩次調用MyProject.ControlLibrary.dll上的Assembly.LoadFile。 似乎在第二個LoadFile之后,xaml資源丟失了。 當我防止第二次加載時,似乎可以解決問題。

我也想補充一下有關此主題的信息。

我也使用插件式應用程序,每個程序集都加載在其自己的AppDomain中,但是首先我加載該程序集以查看它是否是以及需要實例化的類。

為此,我曾經使用Assembly.Load(File.ReadAllBytes(file)); 如果在實例化窗口之前執行了此操作,則InitializeComponent()會拋出錯誤。

如果我首先實例化窗口,然后加載程序集,則一切正常。 盡管可以隨時打開和關閉窗口,但是大多數情況下這些組件已被加載。

為了解決此問題,我首先創建了一個單獨的AppDomain,然后使用以下方法在該appdomain中加載程序集:Assembly asm = PrivateAssemblyLoader.Load(File.ReadAllBytes(file));

這樣,當前的AppDomain不會受到加載的程序集的阻礙。

(在我的插件應用程序中,我在執行目錄中查找所有.exe和.dll文件,因此它也可以自行加載。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM