从C#与C交谈

时间:2010-07-14 22:07:30

标签: c# c

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

  1. initialization()=>这将初始化数据结构并将数据从文件加载到内存中。此方法将被调用一次。
  2. ComputeSomething(parameters)=> C#会对这种方法进行多次调用。
  3. 注意:这两个方法实际上调用了其他几个方法,但这些只是我们要向C#公开的两个方法(代码非常复杂,这就是我们不想移植到C#的原因)

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

3 个答案:

答案 0 :(得分:10)

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

http://www.pinvoke.net/

另外,请尝试在SO上搜索有关P/InvokeGoogle的建议

  

c#pinvoke调用c代码

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

这是一个解决方案。该解决方案允许通过使用[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;
 }
相关问题