2017-04-14 63 views
0

我們有一個WPF項目,它使用第三方庫和一些內部軟件包。 wpf程序可以正常工作,程序集可以正確解析並且代碼工作得很好。
該程序提供了從不同來源加載數據的可能性,具體取決於您如何啓動它。如前所述,當調用它自己的時候,它一切都很好,但是如果我們通過提供控制器並將其註冊爲COM interop來完成另一個應用程序的調用,我們會遇到程序集引用問題。裝配參考問題與com對象結合使用

[Guid("93BC7929-8A5F-43EA-AEAB-38B5034758E5")] 
[ComVisible(true)] 
public class ConnectionController : ControllerBase 
{ 
    public override void Run() 
    { 
     var viewModel = new MainWindowViewModel(); 
     var view = new MainWindow {DataContext = viewModel}; 
     view.Show(); 
    } 
} 

由於WPF PROGRAMM被作爲獨立應用程序,還提供了我們提出的控制器到一個不同的項目不引用了很多大會的的,爲WPF庫的示例somekind的。

控制器自己不再擁有邏輯,通常它傳遞com對象提供的一些數據,但總而言之,它唯一要做的就是試圖在不同的項目中實例化MainWindowViewModel。與控制器處於同一解決方案的項目已正確解決,但第三方的東西不是。

只要我們通過控制器調用wpf程序,引用第三方庫的項目就無法再解決它的引用並引發異常。

解決這類問題的正確方法是什麼?我們是否必須在GAC中註冊第三方dll?或者他們的財產是我們必須調整的?我們無法繞過它。有關參考文獻以及如何解決的每一個信息都會受到讚賞

+0

「不同的應用程序」是問題所在。 CLR仍按正常方式查找程序集,首先是GAC,然後是EXE文件的目錄。即使該EXE不是託管應用程序。如果您在註冊時使用了/ codebase,則只有具有[ComVisible]類型的DLL才能自動找到。因此GAC解決了這個問題,並將DLL複製到其他應用的安裝目錄中解決了這個問題。從技術上講,你可能能夠使AppDomain.AssemblyResolve工作,但重要的是你有一個上帝類,客戶端代碼總是必須首先創建。 –

+0

@Hans Passant非常感謝你,這些信息解決了我們的問題,並帶來了對該主題的更多見解。你能複製/粘貼你的評論作爲答案嗎?我想將問題標記爲已回答 – yRadwan

+0

只需分享您在自己的帖子中使用的方法,我無法猜測您決定要做什麼。將您的帖子標記爲答案。 –

回答

0

感謝@Hans Passant,我們爲我們的問題找到了解決方案。對於第一次嘗試,我們只需將所需的dll複製到正在執行的程序集的文件夾中,它就像一個魅力一樣工作。這不是最終的解決方案,很可能我們會使用代碼庫,但也可以使用god類,因爲控制器總是首先被創建。我認爲我們會盡量保持控制器儘可能小,並讓應用程序處理它如何獲取它的資源。