c/c++语言开发共享float *从C到C#

我不是一个真正的CS人,所以如果你们这里的天才能指出我正确的方向,我将永远感激。

我有一个c-code命令行函数,用于将其结果写入文件。 我将其转换为通过float *数组将其数据返回到类似的C ++程序(以避免常量文件I / O):

float * mgrib(int argc, char **argv) 

这非常有效。 我现在需要把它变成一个C#程序,这就是事情变得混乱的地方。

我做的第一件事就是避免使用char **来使争论成为一系列bool。 如果我允许它仍然转储到文件,这工作正常。

问题是在C#中使用c风格的float数组。 在c-code中,它被分配了malloc。

所以这是我尝试过的一切都没有成功(我知道数组的大小):

__a)使用Marshal.AllocCoTaskMem分配它。 使用Marshal.FreeCoTaskMem释放它。

__b)使用Marshal.Copy进行分配。 使用Marshal.FreeCoTaskMem释放它(也许这是错的?)

我已经涉足了我能在网上找到的所有东西。 如果需要更多信息,请告诉我。 我希望这只是一个我想念的简单概念。

    将此签名用于C函数(将mgrib.dll替换为真实的库名)。

     [DllImport( "mgrib.dll", EntryPoint = "mgrib" )] public static extern IntPtr mgrib( int argc, [MarshalAs( UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr )] StringBuilder[] argv ); 

    调用mgrib函数如下:

     // Prepare arguments in proper manner int argc = 0; StringBuilder[] argv = new StringBuilder[ argc ]; IntPtr pointer = mgrib( argc, argv ); 

    调用完成后,您可以得到如下结果:

     float[] result = new float[ size ]; Marshal.Copy( pointer, result, 0, size ); 

    编辑

    由于mgrib使用malloc分配内存,我们需要使用free函数释放内存。 但是,您必须将调用包含在另一个将从本机库导出的函数中的free函数中。

     extern "C" __declspec(dllexport) void mgrib_free( float* pointer ); void mgrib_free( float* pointer ) { free( result ); } 

    然后将其导入如下:

     [DllImport( "mgrib.dll", EntryPoint = "mgrib_free", CallingConvention = CallingConvention.Cdecl )] public static extern void mgrib_free( IntPtr pointer ); 

    并调用它如下:

     mgrib_free( pointer ); 

      以上就是c/c++开发分享float *从C到C#相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560172.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐