从C#与C交谈

我有一个用C(而不是C ++)实现的遗留代码。 我希望能够从我的C#代码(在Windows上)中调用此C代码中的一些方法。 这两种语言之间接口的最佳方法是什么? 请注意,C中的方法不是无状态的。 我们需要调用两种方法:

  1. initialization()=>这将初始化数据结构并将数据从文件加载到内存中。 此方法将被调用一次。
  2. ComputeSomething(参数)=>从C#到这个方法会有几次调用。

注意:这两个方法实际上调用了其他几个方法,但这些只是我们要向C#公开的两个方法(代码非常复杂,这就是为什么我们不想移植到C#)

我已经能够将c代码导入visual studio并能够成功编译代码。 我知道我们可以将C代码实现为windows服务,但我正在寻找一种允许我们直接从C#调用C方法的解决方案。 任何指针都非常感谢! (COM互操作与我要做的事情有关吗?)

听起来你可以使用P/Invoke 。 查看此站点以获取提示:

http://www.pinvoke.net/

另外,尝试搜索SO以获取有关P/InvokeGoogle for的建议

c#pinvoke调用c代码

我手边没有任何技术示例,但我编写了一些.NET代码,通过P/Invoke Win32 API。 棘手的部分是在传递参数时使方法签名正确。 这可能会帮助你。

最新版本的Visual Studio允许您编写可以调用不安全函数但仍与CLR托管代码接口的C ++代码。 他们称之为“隐式PInvoke”或“C ++ / CLR”。 查看MSDN文章“ 使用C ++ Interop ”了解更多信息。

托管代码无法直接调用非托管代码,因此您需要包装器函数来处理内存管理问题并在.NET对象和应用程序的数据结构之间进行转换。 从上面的链接,请查看“如何:使用C#使用本机类”一节。

这是一个解决方案。 该解决方案允许通过使用[DllExport]属性(与P / Invoke DllImport相反)修饰您的函数来从C调用C#函数。

https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

C#代码

 class Test { [DllExport("add", CallingConvention = CallingConvention.StdCall)] public static int Add(int left, int right) { return left + right; } } 

C代码

  int main() { int z = add(5,10); printf("The solution is found!!! Z is %i",z); return 0; }