2010-11-09 79 views
5

我有一个以C语言编写的遗留应用程序,我想逐步将一些代码移到C#中。但在能够重写所有内容之前,我只需要在c#中首先编写几个将要从C中使用的组件。如何从纯C应用程序重用.Net程序集

回答

2

我假设你的C# class是一个静态类。您需要在C++/CLI中创建一个互操作层,然后才能在纯C中使用它。创建一个C++/CLI类来包装您的C#类。完成后,使用导出功能导出具体的功能C函数。 C++/CLI将代表您管理互操作。经验法则是如果你的class/function有任何CLI,它将是CLI。所以你的外部函数应该只返回本地数据类型。

extern "C" __declspec(dllexport) int MyFunc(long parm1); 

这是一篇帮助您入门的文章。它将C++转换为C#但是这个过程在你的情况下是相反的。 CodeProject不幸的是,没有方便的反向PInvokeC

不幸的是,我从来没有从C#C。这听起来像一个有趣的项目。祝你好运!

好的如果你还没有弄清楚,我有一个快速的样本给你。

C#CSLibrary.Math.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CSLibrary 
{ 
    static public class Math 
    { 
     static public int Add(int a, int b) 
     { 
      int c = a + b; 
      return c; 
     } 
    } 
} 

.cpp的/ C++项目CPPCLibrary.h(编译与C++/CLI期权项目依赖)

#pragma once 

using namespace System; 

extern "C" __declspec(dllexport) int MathAdd(int a, int b) 
{ 
    return CSLibrary::Math::Add(a, b); 
} 

C++项目CTEST .c(编为C代码)

#include "stdafx.h" 
#pragma comment(lib, "../Debug/CPPCLILibrary.lib") 

extern __declspec(dllimport) int MathAdd(int a, int b); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int answer = MathAdd(10, 32); 
    _tprintf(_T("%d\n"), answer); 
    return 0; 
} 

所有文件都在相同的解决方案,但不同的项目。我已经证实这个工作。我希望这有助于任何遇到它的人。

干杯!

+0

如果我有一些时间,我想创建一个小的演示。这听起来很有趣。 – 2010-11-09 23:01:07

0

如果代码是纯C,则可以将它放入Visual C++组装项目没有太多困难。从那里,你可以访问一个常规的.net api。