2009-04-19 261 views
4

我有一個C++ DLL(無碼),我希望暴露給.NET應用程序。我正在考慮所有可以找到的選項(COM,P/Invoke,SWIG等),我正在編寫一個.NET類庫(在C++/CLI中)。現在生成的DLL(類庫)也需要原始DLL及其依賴關係。我的問題就出在自動地跟蹤這樣的事情,讓使用該包裝不具有應用來跟蹤其他(原生)DLL文件(特別是如果原來的DLL(S)開發新的扶養)的。跟蹤DLL依賴用於包裝原生C++ DLL到.NET

更精確地(並且有一些具體的討論),我試圖總結cmr,所以我寫MR,類庫(這取決於cmr,自然)。 cmr取決於PNLOpenCV,等等。當我嘗試在(C#)項目中添加對MR的引用時,Visual Studio(2005 SP1)剛剛複製了MR.DLL,留下了所有依賴關係,然後抱怨(丟失關於缺少的模塊的FileNotFoundException)。手動複製cmrPNL,等來了bin目錄解決了這一問題。

事不宜遲,我的問題是:有沒有一種方式,.NET應用程序只添加一個引用到一個DLL,一切只是工作

我已經沖刷通過谷歌和SO,無果......

編輯:mergebin似乎是最接近於我正在尋找,但它只能合併與.NET的DLL一個本地DLL。太糟糕了,不能合併原生DLL。

回答

6

你可以看看mergebin,這個工具允許你將非託管和受管DLL合併爲一個程序集。System.Data.SQLite使用這種方法。

0

聽起來像是你有兩個具體問題:

  1. 如何通過本機代碼的DLL複製構建開始
  2. 之前如何動態地計算出需要的情況下被複制的原生代碼的依賴關係他們改變。

爲1),你可以使用預生成步驟在C#項目調用自定義UTIL在正確的文件進行復制。

看起來像2)已經是answered here on Stack Overflow

0

那麼,您可以簡單地添加命令,將所需的DLL自動複製到正確的輸出目錄中,作爲生成過程的一部分。這是通過轉到項目的屬性在Visual Studio中完成的。

項目 - >屬性MyProjectName ... - >生成事件

添加的命令副本,需要到$(TARGETPATH)的文件,你就大功告成了。

另一種選擇是簡單地將項目的當前工作目錄(當你從Visual Studio運行時)設置爲你需要的所有DLL所在的目錄。在外部執行程序時,您仍然必須手動複製文件,但它會使開發更容易一些。

2

我目前有一個非常類似的問題。

一大步太符合我的目標是通過在C++/CLI項目預建步到本地.DLL複製到輸出目錄,並添加鏈接器選項

/ASSEMBLYLINKRESOURCE:"$(OutDir)\Native.dll" 

此寫入導致程序集中存在屬於程序集的文件「Native.dll」。現在引用該項目/程序集的所有項目也將複製Native.dll! (如果你把你組裝在那裏,它也應該進入GAC--我沒有檢查)。

好的,你仍然需要添加所有依賴native.dll的。 如果你從一個非常不同的路徑通過Assembly.LoadFrom()加載程序集,我也不知道本地DLL是否在運行時找到(這是我必須解決的問題,因爲我們的C++/CLI包裝器裝配是Visual Studio設計人員需要的)。

我希望這可以幫助你一點點,因爲你是問題。

編輯:

進一步的調查表明,包裝.DLL總是能夠找到本地.DLL ......那是一件好事。不好的一面是,當您打開表單時,Visual Studio Designer會將所需的程序集複製到臨時目錄(用戶目錄內的某處)。當它複製程序集時,它會忽略鏈接的資源,並通過這個本地.DLL!

+0

+1這是一個不錯的方法。本機dll名稱嵌入在託管dll的清單中。構建工具(至少在理論上)可以找出本地依賴關係,儘管DLL仍然在飛行。在Web部署場景中運行良好。 – tivadj 2012-12-16 14:54:49