C# 从C调用stdlib.h函数#

C# 从C调用stdlib.h函数#,c#,pinvoke,C#,Pinvoke,出于不同的目的,我需要提供一个在C中实现以下功能的接口# 马洛克 卡洛克 realloc 免费的 但我宁愿不自己编写代码(为什么要重新发明轮子)。 更好的解决方案是,当调用我的alloc函数时,我会简单地调用stdlib.h中的alloc函数,接口是这样做的,所以我“只”需要调用这些函数 问题是,如何从C#访问stdlib.h中的函数? 我知道平台调用,而且我在这方面越来越好。但要让平台调用工作,我需要一个.dll 我不知道哪个.dll实现了stdlib.h,我认为这听起来不是解决您问题的最

出于不同的目的,我需要提供一个在C中实现以下功能的接口#

  • 马洛克
  • 卡洛克
  • realloc
  • 免费的
但我宁愿不自己编写代码(为什么要重新发明轮子)。 更好的解决方案是,当调用我的alloc函数时,我会简单地调用stdlib.h中的alloc函数,接口是这样做的,所以我“只”需要调用这些函数

问题是,如何从C#访问stdlib.h中的函数? 我知道平台调用,而且我在这方面越来越好。但要让平台调用工作,我需要一个.dll
我不知道哪个.dll实现了stdlib.h,我认为这听起来不是解决您问题的最佳方案。但要回答这个问题,首先需要决定使用哪个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);

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

我认为这听起来不是解决你问题的最好办法。但要回答这个问题,首先需要决定使用哪个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);

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

无法对此进行升级投票,因为您建议使用可以随时删除的@Mgetz@Mgetz@Mgetz@Mgetz@Mgetz链接到其他C运行时。但是,任何系统组件都可能在将来被删除。谢谢你的回答,你会建议我怎么做?目前的问题是我需要提供这些函数。而且,我应该在我的项目中包括msvcrt.dll,还是系统确切地知道msvcrt.dll在哪里?我对您的问题了解不够,无法推荐解决方案。msvcrt.dll是一个系统组件。它是Windows的一部分。无法对此进行升级投票,因为您建议使用可以随时删除的@Mgetz@Mgetz(根据MS文档,您不应该链接到它)@Mgetz,或者链接到其他C运行时。但是,任何系统组件都可能在将来被删除。谢谢你的回答,你会建议我怎么做?目前的问题是我需要提供这些函数。而且,我应该在我的项目中包括msvcrt.dll,还是系统确切地知道msvcrt.dll在哪里?我对您的问题了解不够,无法推荐解决方案。msvcrt.dll是一个系统组件。这是Windows的一部分。不提及你的“目的”是一个很大很大的错误。这些C函数实际上什么都不做,只是直接调用相应的winapi函数。比如HeapAlloc()。需要堆句柄的函数。这个句柄值从来都不是一个小细节,你很可能会得到错误的句柄。如果你愿意分享的话,我很想听听什么类型的问题需要从C#直接访问这些例程。我在脑子里苦苦思索着我为什么要这么做。这个案子的目的是,我有一个3。需要此接口的参与方库。原因是3。party Library之所以需要它,是因为该库是为在不同平台和嵌入式硬件上工作而编写的。它还需要一个文件和日志处理程序。不提及你的“目的”是一个很大的错误。这些C函数实际上什么都不做,只是直接调用相应的winapi函数。比如HeapAlloc()。需要堆句柄的函数。这个句柄值从来都不是一个小细节,你很可能会得到错误的句柄。如果你愿意分享的话,我很想听听什么类型的问题需要从C#直接访问这些例程。我在脑子里苦苦思索着我为什么要这么做。这个案子的目的是,我有一个3。需要此接口的参与方库。原因是3。party Library之所以需要它,是因为该库是为在不同平台和嵌入式硬件上工作而编写的。它还需要一个文件和日志处理程序。