C# 从C到C的对话#

C# 从C到C的对话#,c#,c,C#,C,我有一个用C实现的遗留代码(不是C++)。我希望能够从我的C#代码(在Windows上)调用此C代码中的一些方法。两种语言之间的最佳接口方式是什么?请注意,C中的方法不是无状态的。我们需要调用两种方法: initialization()=>这将初始化数据结构并将数据从文件加载到内存中。此方法将被调用一次 ComputeSomething(parameters)=>将有几个C#调用此方法 注意:这两个方法实际上调用了其他几个方法,但这只是我们想向C#公开的两个方法(代码非常复杂,这就是为什么我们不

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

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


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

    听起来您可以使用
    p/Invoke
    来实现这一点。查看此网站以获取提示:

    此外,请尝试搜索
    SO
    以获取有关
    p/Invoke
    的建议,并搜索
    Google
    以获取

    c#pinvoke调用c代码


    我手头没有任何技术示例,但我编写了一些.NET代码,通过
    p/Invoke
    调用Win32 API。棘手的部分是在传递参数时获得正确的方法签名。可以帮助您解决问题。

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


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

    这里有一个解决方案。该解决方案允许通过使用[DllExport]属性(与P/Invoke-DllImport相反)装饰函数,从C调用C#函数

    C#代码

    C代码

    class Test
    {
         [DllExport("add", CallingConvention = CallingConvention.StdCall)]
         public static int Add(int left, int right)
         {
             return left + right;
         } 
    }
    
     int main()
     {
          int z = add(5,10);
          printf("The solution is found!!! Z is %i",z);
          return 0;
     }
    

    为什么不在c#上实现方法?c代码的编译输出是什么?如果它是一个.dll并且支持COM,那么您应该能够从Visual Studio中进行“添加引用”并浏览到dll文件。如果您还没有这样做,那么将函数包装在COM co类中并使用.NET/COM互操作似乎太多工作/过度了。正如Jason Evans所建议的那样,我只需将这两个C函数放在一个DLL中,并使用P/Invoke访问它们。@Luiscencio:这两个C方法实际上调用了其他几个C方法。整个代码相当复杂,但我们只想将这两个方法公开给C#@好像输出是.dll,让我试试是否可以添加引用。谢谢你的回答!您知道P/Invoke是否适用于方法调用是有状态的情况吗?(在调用另一个方法之前,需要调用initialize来加载数据)全局变量是否保留在内存中以供后续的方法调用?我不知道。但是,由于C代码需要加载到.NET代码的地址空间中并保持驻留状态(不是每次都动态加载),因此我希望C代码的值保持不变。恐怕这是你需要试验的东西(让我们知道你发现了什么,以及我的逻辑是否完全错误!