2009-07-07 52 views
5

問題:我有一個WinForms控件('MyControl'),它依賴於myCli.dll,一個用C++ CLI編寫的dll。該組件是第三方(由另一個團隊編寫)。 myCli.dll依賴於由另一方編寫的myLibrary.dll。該控件位於myAssembly.dll中,該文件是C#控件和資源庫。由於未解決的依賴關係,無法使用Winforms控件

當myCli.dll沒有依賴於myLibrary.dll時,我有這個控件工作得很好。我可以將它添加到表單,構建它等等。但新版本的myCli.dll出來了,我重新鏈接了它。突然間,IDE表現不佳。關鍵問題似乎是IDE無法解析myLibrary.dll上的myCli.dll依賴項。

當我嘗試從工具箱拖動到設計圖面的控制,我得到的錯誤:

"Failed to create component 'MyControl'. 

錯誤消息如下:

'System.IO.FileNotFoundException: Could not load file or assembly 'myCli.dll, Version 0.0.0.0, Culture=neutral, PublicKeyToken=2fb8da784abc560a' or one of its dependencies. 
The system cannot find the file specified" 

我的信念是,如果我能找出把myLibrary.dll放在哪裏,我會解決參考問題。我不知道這是肯定的。有人知道我應該怎麼做來解決這個問題嗎?

回答

0

我認爲DLL需要進入項目目錄,然後將其設置爲複製到生成的輸出目錄。

+0

我試過了。它沒有工作 – MedicineMan 2009-07-07 16:47:41

0

對於設計師的支持,我覺得myLibrary.dll必須要麼進入C:\Program Files\Visual Studio xxx\Common7\IDE\PublicAssemblies(假設myCLI.dll也住在這裏),或到地方myCLI.dll存在,或者你可以嘗試將其複製到C:\Windows\System32 - 系統應該能夠找到它然後。

確保將其添加到項目中,並將其設置爲Clippit '98建議的「始終複製」。

0

找到合適位置的另一種方法可能是使用Process Monitor。只需過濾你的DLL的輸出,並檢查它搜索文件的路徑。

0

myCli.dll及其所有依賴項需要位於完全相同的文件夾中,否則VS將無法找到它們。

要做到這一點,最簡單的方法是確保當它生成myCli.dll時,它將所有文件複製到調試/發佈文件夾,然後從調試/發佈文件夾中引用項目中的這些控件直。

1

在我的情況下,我的Initialize和Form_Load上的代碼包含調用另一個項目,具體取決於DLL引用。通過排除此代碼與

if (!DesignMode) 
{ 
    //add your initializing code (for runtime!) here 
} 

我能夠添加控件的設計時間。

HTH

0

我知道這是一個古老的線程,但只是插嘴與我用來解決我確切的問題。

我最初使用PeterRakké的解決方案(https://stackoverflow.com/a/15077337/34440)。但它並不是理想的,因爲它迫使我改變一貫的模式。

由於我的C++/CLI在執行時只使用本地dll中的函數,並且包含它自己的接口信息,所以我只是將本機dll更改爲延遲加載。我在Visual Studio項目設置(項目屬性 - >配置屬性 - >鏈接器 - >輸入 - >延遲加載的Dll)下添加了兩個本地dll。確保將屬性對話框頂部的「配置」和「平臺」下拉列表設置爲「全部」選項,然後執行完整的重建。

然後我可以在我的嵌套控件和表單中引用C++/CLI DLL中的類型。

+0

上帝是那些可怕的時代。很高興我不必再做那種垃圾了 – MedicineMan 2013-03-20 21:33:16

0

與MedicineMan相同的情況。 WinForms項目使用libraryA.dll中的兩個不同組件,而這些組件又依賴於libraryB.dll。爲我工作

解決方案(只是參照適用的DLL文件中的所有項目,即使所有的圖書館都建在調試模式,且無需手動複製DLL文件到不同的文件夾):

  1. 對於LibraryA的組件。 DLL,它覆蓋繪製的事件,如果出口在設計時模式:

    If Me.DesignMode Then Exit Sub 
    
  2. 有關使用各類公共場所,libraryB.dll在libraryA.dll組件,使用屬性來隱藏從設計師這些屬性(仔細檢查語法 - 我已經看到有一些奇怪的拼寫/變化等幾個職位):

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> 
    
  3. 重新構建組件,然後使用WinForms項目,然後再重新啓動Visual Studio。出於某種原因,在同一個會話期間沒有檢測到屬性的變化,並且在嘗試顯而易見之前我燒了幾個小時。

如果你仍然有問題,有對部件中獲得調試信息結合的優秀後(即當你拖歐米茄下降組件到形式):How to enable assembly bind failure logging (Fusion) in .NET(向下滾動由Mike Goatly回答) 。

祝你好運。