2012-07-18 33 views
3

我有一個非託管的C++ dll,它將被託管的C++/CLI包裝器.dll使用,最終將由C#項目使用。非託管C++ - 需要強名稱才能被具有強名稱的C++/CLI dll引用?

C#項目名稱很強大,封裝器.dll也是如此。我嘗試使用/ KEYFILE做同樣的非託管dll,但似乎不起作用。包裝正在抱怨:

.... is a strong-name signed assembly and embedding a manifest invalidates the signature 

我是否需要命名非託管C++呢?如果不是,我該如何解決這個問題?

+2

C++沒有一個「強名稱的概念」。程序集及其名稱(無論是否強大)不是C++或基本.dll工作的一部分。他們是.NET構造。 – 2012-07-18 23:13:21

+0

那麼當我試圖運行C#應用程序時,如何解決包裝類中的構建警告和最終錯誤? – 2012-07-18 23:16:58

+0

可能重複的[強名dll - 如何排查?](http://stackoverflow.com/questions/11549339/strong-name-dll-how-to-troubleshoot) – 2012-07-19 02:38:12

回答

2

強命名本機DLL是不可能的。大部分原因是因爲這樣做毫無意義,只有CLR纔會驗證強名稱,並且只能在.NET程序集中這樣做。

以防萬一:強名稱是而不是替代代碼簽名證書。最大的提示是這樣,因爲你不必把大量的錢交給任何人。

+0

謝謝漢斯!這證實我完全錯誤的方向:(你能給我另一個暗示我想做什麼?我想我應該在我的包裝中做[DllImport ...],我在正確的軌道上嗎? – 2012-07-19 02:58:29

+0

我不知道你在做什麼,聽起來是對的 – 2012-07-19 07:41:42

+0

好吧我想我解決了這個問題,只需讓本機代碼在CLR上運行(使用/ clr),它仍然是非託管代碼(就像我一樣沒有使用任何託管功能),但它運行在.NET上,這樣我就可以強制命名,否則我需要使用P/Invoke,並且我找到的唯一材料是:http://www.codeproject。 com/Articles/14180/Using-Unmanaged-C-Library-DLL-in-NET-Applicatio這似乎很涉及。 – 2012-07-19 17:00:57

4

終於搞定了這一切,即我的C#應用​​程序調用C++/CLI包裝DLL,它調用本機C++ DLL中的類!

爲了解決這個問題:

mt.exe : general warning 810100b3: ... MyWrapper.dll is a strong-name signed assembly and embedding a manifest invalidates the signature. You will need to re-sign this file to make it a valid assembly. 

重要信息:原來,在引用的類強名稱不是問題。

事實證明,在這種情況下,VS如何簽署包裝DLL有些問題。見鏈接:在您的包裝Çhttp://blogs.msdn.com/b/vcblog/archive/2011/03/11/10140139.aspx

總之,要解決這個問題,++類,添加爲你的後生成的命令再簽收:

sn.exe -R $(SolutionDir)$(Configuration)\MyWrapper.dll MyKeyFile.snk 
+0

如果SN a使用'ECHO <您的密碼> |將sks作爲密碼加在上面的「sn.exe」行的前面'管你的密碼,按照我的SO貼在這裏:http://stackoverflow.com/questions/3138106/auto-entering-password-in-sn-exe/14657401#14657401 – 2013-02-02 01:13:40