2012-10-15 51 views
1

我有一個WPF容器應用程序(包含ContentControl主機)和一個集裝箱應用程序(UserControl)。兩人都沒有注意到對方。WPF XAML引用未通過myAssembly.GetReferencedAssemblies()解析()

只有一個XML配置文件包含集裝箱內部的集裝箱DLL的字符串dllpathViewModelClass的完整名稱空間名稱。

容器中的通用代碼解析了集裝箱的裝配(Assembly.LoadFrom(dllpath))並使用Activator.CreateInstance(vmType)創建了視圖模型的實例。當這個viewmodel被託管在容器的ContentControl裏面時,相關的vierwmodel特定的ResourceDictionary被添加到容器的內容控件的ContentControl.Resources.MergedDictionaries,所以視圖加載正常。

現在我的集裝箱必須使用我的本地C:\Lib文件夾中的程序集引用WPFToolkit.dll來承載WPF DataGrid

複製本地參考WPFToolkit.dll被添加到.csproj文件containee的項目和它只是利用其XAML namepsace在UserControl.XAML稱。這樣我的集裝箱應用程序中的我的bin\debug文件夾獲得WPFToolkit.dll複製。

XAML:

xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" <Controls:DataGrid ItemsSource="{Binding AssetList}" ... />

問題: 當下ViewModel(即containee的用戶控件)嘗試加載本身我得到這個錯誤。

「Can not find type'Microsoft.Windows.Controls.DataGrid'。編譯時使用的程序集可能與加載時使用的程序集不同並且類型缺失。

因此,我試圖在viewmodel託管之前加載集裝箱的引用程序集(myAssembly.GetReferencedAssemblies())。 WPFToolkit不在那裏的程序集列表!

奇怪的是我有另一個DLL在集裝箱代碼庫中稱爲Logger.dll,但這個是用C#代碼實現的。所以我在myAssembly.GetReferencedAssemblies()正確解決其參考。

那麼這是否意味着程序集的BAML引用永遠不會被GetReferencedAssemblies解析?

編輯:

忘了補充我在做一個containee後生成事件到XCOPY所有bin\debug\*.*到容器的「本\調試」。它的作品。但是我不希望所有的集裝箱被這樣複製到集裝箱上。容器應該忽略集裝箱應用程序(甚至是dll)直到運行時。

+0

僅用於測試目的,只能嘗試將'wpfToolkit.dll'移動到'exe'文件所在的文件夾,並查看是否可以解決該問題。如果是這樣,你的應用程序不能找到這個'dll',所以通過附加到'AppDomain.AssemblyResolve'事件並自己找到它來添加自定義參考解析器。 – Rafal

+0

忘了補充我在containee做了一個post build事件,把所有的'bin \ debug \ *。*'拷貝到容器的'bin \ debug'中。它的作品。但是我不希望所有的集裝箱被這樣複製到集裝箱上。容器應該忽略集裝箱應用程序(甚至是dll)直到運行時。 –

回答

0

解決您的問題可能是爲AppDomain.AssemblyResolve事件添加處理程序。當需要程序集並且應用程序無法以普通方式找到時,此事件被稱爲最後的手段。這是您可以通過掃描您的containees文件夾(從配置中讀取所以沒有困難關係)來自定義此過程以嘗試查找所需的dll的地方。

+0

Thx拉法爾。是的,我重新創建了引用(物理路徑,即'C:\ Lib'和引用的程序集DLL的名稱,即'WPFToolkit.dll')到一個'.. \ containeeApp \ bin \ debug \ containee.dll.config'文件並解析它們在這個事件中。 **有人說我們仍然不知道爲什麼XAML大會參考文獻在反思時無法提供**。 –