从C#调用stdlib.h函数

时间:2014-05-09 22:44:19

标签: c# pinvoke

出于不同的目的,我需要提供一个在C#

中实现以下功能的接口
  • 的malloc
  • 释放calloc
  • 的realloc
  • 自由

但我宁愿不自己编码(为什么重新发明轮子)。 一个更好的解决方案是当我的alloc-functions被调用时,我会简单地调用stdlib.h中的alloc-functions,接口是这样的,所以我“只需要”调用那些函数。

问题是,如何从C#访问stdlib.h中的函数? 我知道平台调用,我越来越好了。但是为了平台调用工作,我需要一个.dll 我不知道哪个.dll实现了stdlib.h

1 个答案:

答案 0 :(得分:3)

我认为这听起来不是解决问题的最佳方案。但要回答这个问题,首先需要决定使用哪个C运行时。一种可能性是msvcrt.dll中的系统组件。访问这样的功能:

[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr malloc(IntPtr size);

[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern void free(IntPtr ptr);

[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr calloc(IntPtr num, IntPtr size);

[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr realloc(IntPtr ptr, IntPtr size);

然而,MS的官方立场是msvcrt.dll是私有的,不适用于第三方应用程序。因此,您可能更愿意链接到与特定版本的MSVC关联的C ++运行时。例如,要链接到VS2013运行时,请指定msvcr120.dll。这当然需要您分发该运行时。