【发布时间】:2010-11-09 22:42:26
【问题描述】:
我有一个用 C 编写的遗留应用程序,我想逐步将一些代码移至 c#。但在能够重写所有内容之前,我需要先用 C# 编写几个组件,这些组件将从 C 中使用。
【问题讨论】:
我有一个用 C 编写的遗留应用程序,我想逐步将一些代码移至 c#。但在能够重写所有内容之前,我需要先用 C# 编写几个组件,这些组件将从 C 中使用。
【问题讨论】:
我假设您的 C# 类是静态类。您需要在 C++/CLI 中创建一个互操作层,然后才能在纯 C 中使用它。创建一个 C++/CLI 类来包装您的 C# 类。完成后,使用导出函数导出特定的 C 函数。 C++/CLI 将代表您管理互操作。经验法则是,如果您的类/函数有任何 CLI,它将成为 CLI。所以你的外部函数应该只返回本机数据类型。
extern "C" __declspec( dllexport ) int MyFunc(long parm1);
这里有一篇文章可以帮助您入门。它将 C++ 转换为 C# 但在您的情况下该过程是相反的。 CodeProject 不幸的是,对于纯 C,没有方便的反向 PInvoke。
很遗憾,我从未从 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;
}
所有文件都在同一个解决方案中,但在不同的项目中。我已经确认这有效。我希望这对遇到它的人有所帮助。
干杯!
【讨论】:
如果代码是纯C,你可以将它放入一个可视化的C++汇编项目中,没有太大的困难。从那里,您可以访问常规的 .net api。
【讨论】: