簡體   English   中英

從C#應用程序添加一個引用到沒有/ clr編譯的DLL?

[英]Add a Reference from a C# App to a DLL compiled without /clr?

我正在使用Visual Studio 2008構建一個包含兩個項目的解決方案:C#Console應用程序和C ++ DLL。 我希望應用程序使用P / Invoke從dll調用函數。 因此,我正在嘗試將dll添加為C#應用程序的參考。 但是當我嘗試添加引用命令時,Visual Studio將不允許我這樣做,除非我在dll上設置/ clr屬性(在Configuration Properties:General下)。 現在,我認為P / Invoke可以處理普通的win32 dll。 實際上,如果我在沒有/ clr的情況下構建我的dll並且只是手動將它復制到bin / Debug,那么應用運行正常。 那么為什么/ clr需要添加dll作為參考? 如果VS不允許我添加它,是否有一些(干凈的)解決方法,以便我的應用程序找到DLL?

我看到有人在這里有類似的問題(雖然有第三方dll): 無法添加DLL參考VS 2008他得到的答案是構建一個包裝器。 但這並不是必需的,因為應用程序可以使用dll就好了; 它只是添加引用步驟不起作用。 此外,包裝器代碼是否需要引用dll,引發與以前相同的問題? 我真的很喜歡一個不涉及編寫包裝器的答案。

為什么不添加一個生成后步驟來將非托管DLL復制到項目目錄中? 您不需要“引用”來引用非托管DLL,這聽起來像您遇到的唯一問題是由於文件沒有自動復制到搜索路徑中。

在C ++ DLL上使用PInvoke時,不必添加引用。 只有在另一個DLL中調用托管代碼時才需要引用。 只需將C ++ DLL放在同一目錄中,並將其名稱添加到DllImport屬性中

從理論上講,您可以將C ++ - DLL作為鏈接資源添加到C#-DLL中。 這將使.NET復制您的C ++ - DLL,無論它將C#-DLL復制到GAC中。 從理論上講,存在一些缺點:

  • 您可以通過命令行選項指示C#編譯器(csc.exe)添加鏈接的資源,但我從未找到過通過.csproj文件甚至Visual Studio執行此操作的方法
  • 如果C#-DLL包含WinForms用戶控件並且您想在設計器中使用它,它將無法工作,因為Winforms-Designer將C#-DLL復制到它加載它的臨時位置,但它忽略了鏈接的資源。
  • 如果你將C#-DLL放入GAC,我不知道它是否有效(是的,C ++ - DLL也會作為一種資源,但我不知道在運行你的C#-DLL時是否找到它!)

因此,如果以上都不適合您,您可以調用以下csc.exe:

csc.exe ... /linkresource:cpp.dll

希望這可能有所幫助!

通過執行以下操作解決了類似問題:

  1. 在所有開發機器上 ,將有問題的dll-s的路徑添加到PATH環境變量中。 這樣,所有開發人員都可以調試所有使用非托管dll-s引用程序集的可執行文件,而無需為每個可執行文件編寫后期構建腳本。

  2. 對於生產,每晚msbuild任務將所有內容構建到單個文件夾,並且標記為“Content / Always copy”的非托管dll-s會自動包含在它們所屬的那個程序集的構建中。

暫無
暫無

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

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