找回密码
 立即注册

QQ登录

只需一步,快速开始

graper

高级会员

45

主题

63

帖子

1348

积分

高级会员

积分
1348

活字格认证

graper
高级会员   /  发表于:2009-12-14 09:33  /   查看:6904  /  回复:0
Post by "KevinShan",  03-27-2007, 12:27
-----------------------------------------------------

本文提供了一个方法,让C++源码和C#源码一起编译链接成一个单一的Assembly。
  由于C++提供了IJW方法,允许将旧有C++代码也编译成托管代码,因此这篇小文可以用极小的工作量来彻底解决所有C++遗留代码移植到.NET的问题。
  这个方法,再加上前次的小文《您也使用托管C++吗?》,就可以把C++遗留代码移植到.NET的所有方法一网打尽了。

  好了,言归正传。
  假设一个很简单的C++程序,它只有一个函数:

  1. //c.h
  2. #pragma once
  3. int sqr(int n);
复制代码

  1. //c.cpp
  2. #include "c.h"
  3. int sqr(int n)
  4. {
  5.   return n*n;
  6. }
复制代码
  为了能让它与C#共同工作,必须为它加个.NET的包装:

  1. //wrapper.cpp

  2. #include "c.h"
  3. namespace wrapper
  4. {
  5.   public ref class calc
  6.   {
  7.   public:
  8.       static int sqr(int n)
  9.     {
  10.       return ::sqr(n);
  11.     }
  12.   };
  13. }
复制代码
  现在可以用C#去调用它了:

  1. //cs.cs
  2. using System;
  3. namespace test
  4. {
  5.   public class Program
  6.   {
  7.     public static void Main()
  8.     {
  9.       Console.WriteLine(wrapper.calc.sqr(11));
  10.     }
  11.   }
  12. }
复制代码
  现在,如何将这些源码编译成一个exe文件呢?
  用集成环境是很难的,最方便的,还是创建一个makefile来完成。
  由于这个例子很简单,我用命令行来创建这个exe文件:

  cl c.cpp wrapper.cpp /c /clr
  生成 c.obj 和 wrapper.obj

  csc /addmodule:wrapper.obj /target:module /out:cs.netmodule cs.cs
  生成 cs.netmodule

  link c.obj wrapper.obj cs.netmodule /LTCG /Subsystem:Console /entry:test.Program.Main /out.exe
  生成 o.exe

  运行 o.exe 显示结果:121

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部