将托管C#DLL包含在非托管C ++ DLL中 - 所有这些都在一个文件中

时间:2014-10-07 00:46:45

标签: c++ .net command-line unmanaged dllexport

简介:How do I combine an unmanaged dll and a managed assembly into one file?

  

与上面的问题相比,我需要将DLL组合起来   最终混合DLL可以将其函数导出到其他非托管的   应用

为此,我想将它们编译为.netmodule,然后将它们组合成一个带链接器的文件,所以我有:

1)Libs - 在C#中使用一些库的项目 - 它没有任何依赖项,我可以像.netmodule一样轻松编译它

2)链接 - 引用C#库的C ++非托管项目,遗憾的是我无法使用cl.exe编译器构建它,因为它总是会出现错误,说明即使我试图找不到C#库中的命名空间将编译器指向可以找到对我的C#程序集的引用的所有文件夹,这个C ++项目就像一个简单的C ++包装器,而不是来自C#的CLR方法

这是我的批处理脚本,第二行会抛出错误:

"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#assembly可以在哪里解析引用,或者我可能需要以批处理命令的方式明确提到我的头文件?

源代码: 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 个答案:

答案 0 :(得分: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 ++)和Libs(C#) - 被分组在一个文件中 - Library.dll。这样我可以将多个项目合并到一个DLL中,无论它们是托管还是本机。