利用vc 连接器特性, 合并托管和非托管代码为一个dll_Earn And Learn_ ...
尽量简单一些, 假设我们有一个 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
C/C++ code



2. cswrapper.cs
C# code



3. cppclient.cpp
C/C++ code
//cl /EHsc cppclient.cpp cpplib.lib #ifdef __cplusplus extern "C" { #endif extern __declspec(dllimport) int __stdcall add(int x, int y); #ifdef __cplusplus } #endif #include <iostream> int main() { int sum = add(3, 5); std::cout << sum << std::endl; return 0; }


4. dotnetclient.cs
C# code



编译交互过程
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 生成选项,
这可以通过直接修改工程文件来达到, 如下
XML code
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProductVersion>8.0.50727</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <OutputType>Module</OutputType> </PropertyGroup>


注意其中的 <OutputType>Module </OutputType>,

通常只有 exe, library 两个选择.


郑重声明:资讯 【利用vc 连接器特性, 合并托管和非托管代码为一个dll_Earn And Learn_ ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——