代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

从托管代码调用C代码

  •  4
  • devoured elysium  · 技术社区  · 14 年前

    我现在有一个C函数,我想在.NET中使用。

    我可以看到实现这一目标的两种方法:

    1. 在VC++.NET上用/CLR编译它(我认为这是可能的),它实现了调用C代码的“FAX.AED”托管方法。

    你觉得什么最好?第一个怎么做?

    更新

    int new_game(double* params1, double* params2);
    

    再问一个问题(尽管更难)

    我有一个功能

    int my_hard_to_interop_function(double** input, double **output, int width);
    

    其中输入和输出都是二维双数组。它们的宽度由 width 它们的高度是由函数知道的。我应该从我的C应用程序中调用这个C方法。

    3 回复  |  直到 10 年前
        1
  •  3
  •   JaredPar    14 年前

    如果这是一个简单的C API,那么最直接的访问方法就是使用PInvoke。PInvoke就是为这个场景而设计的。

    编辑

    [DllImport("insert_the_dll_name_here")]
    public static extern int new_game(ref double param1, ref double param2);
    

    正如汉斯指出的,给定参数的复数名称,这些参数可能是数组,而不是单个值。如果是这样的话,就需要更改签名来说明这一点。例如,如果期望它们是预定的固定大小,则签名将如下所示

    [DllImportAttribute("insert_the_dll_name_here"]
    public static extern int M1(
      [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.R8, SizeConst=5)] 
      double[] params1),
      [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.R8, SizeConst=5)] 
      double[] params2) ;
    
        2
  •  1
  •   dotalchemy    14 年前

    正如JaredPar所说,这是最简单的方法——实际上也是设计好的方法。

        3
  •  1
  •   Ben Voigt    14 年前

    因为你需要在C主程序中单独部署一个单独的DLL函数,所以使用C++ +CLI是最容易的。

    你有C函数的源代码吗?如果是的话,您可以很容易地将它们转换为 ref class . 然后你可以使用 /clr:safe 选项并具有纯托管代码。