2014-10-07 22 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,而不管它们是托管还是本地。