2014-10-07 57 views
1

簡介:How do I combine an unmanaged dll and a managed assembly into one file?包括管理C#DLL非託管C++ DLL - 所有在一個單一的文件

相較於上述,我需要的DLL結合,從而 最終混合DLL可能它們的功能導出到其他非託管的問題 應用程序。

爲此,我想編譯它們既作爲.netmodule,然後將它們與接頭結合成一個文件,所以我有:

1)程序庫 - 在C#中的一些庫項目 - 它不有任何依賴關係,我可以很容易地編譯它像一個.net模塊

2)鏈接 - 引用C#庫的C++非託管項目,不幸的是我不能用cl.exe編譯器構建它,因爲它總是給錯誤說,來自C#庫的命名空間無法找到,即使我試圖指向編譯器所有文件夾,它可以找到對我的C#程序集的引用,這個C++項目結束後,從C#

這裏CLR方法用於像一個簡單的C++包裝是我的批處理腳本,第二行拋出一個錯誤:

"c:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.exe" /target:module /out:./Build/libs.netmodule Libs\Properties\*.cs Libs\*.cs 
"c:/Program Files/Microsoft Visual Studio 12.0/VC/bin/cl.exe" /clr /AI"D:\T\CPlus\Library\Release" /AI"D:\T\CPlus\Library\Libs" /AI"D:\T\CPlus\Library\Libs\Properties" /LN Links\*.cpp 

問題:沒有任何人現在如何讓C++知道它在哪裏可以找到C#程序集來解析引用或者我需要以某種方式在批處理命令中明確提到我的頭文件?

源代碼: C#只是空方法Foo和C++看起來像這樣。

// Links.h 

#pragma once 

#define DllExport extern "C" __declspec(dllexport) 

using namespace System; 
using namespace Libs; // cl.exe cannot resolve this reference 

// Links.cpp 

#include "Links.h" 

DllExport int __stdcall Execute() 
{ 
    Libs::CLibrary::Foo(); 
} 

回答

1

這是最終的工作版本。

"c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" /target:module /out:Libs.netmodule /recurse:..\Libs\*.cs 
"c:\Program Files\Microsoft Visual Studio 12.0\VC\bin\cl.exe" /clr /LN /Fo /Y- /Z7 /FU Libs.netmodule ..\Links\Links.cpp /link /LIBPATH:"c:\Program Files\Microsoft Visual Studio 12.0\VC\lib" /LIBPATH:"c:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib" 
"c:\Program Files\Microsoft Visual Studio 12.0\VC\bin\link.exe" /DLL /LTCG /CLRIMAGETYPE:IJW /OUT:Library.dll Libs.netmodule Links.obj /LIBPATH:"c:\Program Files\Microsoft Visual Studio 12.0\VC\lib" /LIBPATH:"c:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib" 

相關鏈接:

現在我可以在非託管應用程序中使用.NET中的導出函數。而且,來自這兩個項目的所有信息 - 鏈接(C++)和庫(C#) - 被分組到一個文件 - Library.dll中。通過這種方式,我可以將多個項目合併爲一個DLL,而不管它們是託管還是本地。