2012-01-09 75 views
6

我想在我的.NET項目中引用託管DLL,而不將其複製到我的輸出目錄中。所以,當我的程序運行時,它會從安裝的位置運行DLL - 無論它在哪裏。問題在於這個託管DLL調用非託管DLL。當我嘗試引用受管DLL時,它會拋出一個FileNotFound Exception - Could not load file or assembly 'CharacterGen' or one of its dependencies. The system cannot find file specified。當我將輸出設置爲與我引用的DLL相同的目錄時,一切正常。通常的解決方案是引用從另一個程序集中調用的DLL。但是,我無法從託管程序中引用非託管程序集。引用非託管程序集

有沒有辦法引用託管DLL調用非託管DLL?

+0

您是否熟悉GAC ..?如果你不想複製到bin文件夾然後創建一個單獨的文件夾,但你仍然需要將該.dll複製到該文件夾​​,引用它們等。如果不是,你將不得不使用搜索路徑做一些LoadFromAssebly代碼爲什麼會你不想只將.dll複製到一個可以正確引用的位置..還有你想過創建一個MSI安裝程序的方式,如果用戶想要運行你的應用程序/設置它在一個不同的目錄結構.. at至少他們可以做到這一點,相關的參考依賴關係將被處理。 – MethodMan 2012-01-09 19:21:57

+0

我對GAC不太熟悉,但是據我所知,程序集必須簽名。我無法控制我所引用的DLL,因此我無法驗證它們是否已簽名。我想過一個安裝程序,但我不想安裝到用戶的現有目錄中,因爲它不是我的程序目錄,而是存在於我的客戶機上的目錄。如果沒有其他的工作,這將是我的後備。 – XSL 2012-01-09 19:46:14

+1

GAC對引用非託管DLL沒有用處。 – BrainSlugs83 2016-06-11 01:45:24

回答

14

如果你問如何獲得Visual Studio中複製非託管的DLL到您的輸出目錄,你可以這樣做:

  1. 添加非託管DLL作爲項目中的文件或鏈接文件。 (右鍵單擊項目 - >添加 - >現有文件,然後添加或添加爲鏈接)。
  2. 在解決方案資源管理器中選擇該文件。在屬性窗口中設置生成操作來始終複製。
+2

不要忘記,非託管DLL本身可能需要其他非託管DLL。如果你忘記添加這些,你可能會得到完全相同的錯誤。如果您不確定依賴關係是什麼,那麼您可以使用依賴關係助手來幫助您。 – insipid 2012-01-09 20:04:35

+1

「複製,如果更新」更好。 – 2012-01-09 20:26:54

+0

謝謝!只是爲了糾正你,複製總是不在「構建行動」之下,它在「複製到輸出目錄」 – 2013-11-07 12:40:09

0

如果您的解決方案有一堆您正在構建的非託管C++ dll和一個或兩個託管C#程序集,並且它們都需要位於同一個文件夾中,那麼我發現將所有項目使用相同的輸出目錄是最容易管理的解決方案。 - 這樣,如果項目稍後重新命名等等,它們仍然會在正確的位置結束,如果稍後添加新的項目,則不必知道需要添加哪些dll,您只需要將OutputPath設置爲與其他項目完全相同。

爲了達到此目的,我將OutputPath屬性(對於所有配置和平臺,對於每個項目)設置爲$(SolutionDir)\bin\$(Configuration)

一般來說,我不包括在路徑$(Platform),因爲非託管項目,它的命名Win32和託管它的命名x86 - 但如果你真的需要平臺分離,您可以在.csproj的做一些條件邏輯文件來創建具有所需值的新屬性。

相關問題