尽量简单一些, 假设我们有一个 c++ 编写的库, 其中提供了一个加法运算, 现在我们的目的是: 得到一个 dll, 这个 dll 既能在 托管环境下使用, 也能在非托管环境下使用. 在托管环境下, 她是一个纯粹的 程序集; 对于非托管, 使用头文件和导入库的使用方式. 这样一来, 不同用户群就都满意了. (注: 算法实现是在非托管环境中). 此处为了说明方便, 使用的都是控制台程序, 文件及其描述: 1. cpplib.cpp 算法实现, 纯粹非托管的 c++ 代码; 2. cswrapper.cs 上述算法的 .net 封装; 3. cppclient.cpp 非托管客户端测试程序; 4. dotnetclient.cs 托管客户端测试程序; 大体编译过程为, 我们首先将托管封装代码(cswrapper.cs) 编译为一个 netmodule, 再编译非托管类库代码(cpplib.cpp), 在连接过程中将上面生成的 netmodule 作为外部依赖性连接进来, 生成最终的 dll 就是一个托管代码和非托管代码的混合体了, 能达到我们上面所说的目标. 代码文件内容及其编译指令如下: 1. cpplib.cpp
2. cswrapper.cs
3. cppclient.cpp
4. dotnetclient.cs
编译交互过程 1: csc /t:module cswrapper.cs 编译托管模块(netmodule), 生成文件 cswrapper.netmodule 2: cl /LD cpplib.cpp cswrapper.netmodule 编译非托管类库, 连接入托管模块, 生成 cpplib.dll, cpplib.dll(导入库) 3: cl /EHsc cppclient.cpp cpplib.lib 使用导入库编译非托管测试程序 4: csc dotnetclient.cs /r:cpplib.dll 使用混合 dll 作为程序集编译托管测试代码 如果要在 IDE 中操作, 有 1 个注意的问题, 就是在 C# IDE 的工程属性中, 没有 netmodule 生成选项, 这可以通过直接修改工程文件来达到, 如下
注意其中的 <OutputType>Module </OutputType>, 通常只有 exe, library 两个选择. |