如何向.Net公开C静态库

How to Expose C Static Library to .Net?

本文关键字:静态 公开 Net      更新时间:2023-10-16

向C和.Net公开C++函数的步骤是什么?对于32位和64位的构建,我希望在C++、C和.Net中使用相同的函数名。

我之所以发布这个问题和答案,是因为我在任何地方都没有发现这些技术的文档。

步骤为:

  1. 将C++函数公开为C静态库(.lib)。

  2. 使用#pragma语句将库的函数投影到DLL中。

  3. 使用.Net的DllImport属性来公开DLL的函数。

例如,请参阅此github项目。

步骤1。创建一个静态库项目。创建一个C++文件,将每个函数公开为C函数。

extern "C" {
void vfunc(void) { return; }
int ifunc(int i) { return i; }
}

步骤2。创建DLL项目。将静态库指定为"附加依赖项"。创建一个C文件,放入#pragma语句,将每个静态lib函数投影到.DLL中。您需要定义两个#pragma,一个用于32位,另一个用于64位。不同之处在于,32位函数名之前需要一个前导下划线。无需代码,只需#pragmas.

#ifdef _M_X64
#define Alias(func) comment(linker, "/export:" func "=" func)
#else
#define Alias(func) comment(linker, "/export:" func "=_" func)
#endif
#pragma Alias("vfunc")
#pragma Alias("ifunc")

步骤3。创建一个.Net项目。使用DllImport属性来公开每个函数。

class Program
{
[DllImport("c-dll.dll")]
extern static void vfunc();
[DllImport("c-dll.dll")]
extern static void ifunc();
static void Main(string[] args)
{
vfunc();
int i = ifunc(1);
}
}

虽然使用这些技术进行编码很简单,但您需要对解决方案和项目文件进行大量编辑。

  1. 设置解决方案的正确构建顺序。DLL将依赖于静态库。.Net项目将依赖于DLL。

  2. 手动编辑DLL项目文件,将32位和64位DLL构建到单独的目录中(例如Win32\Debug、x64\Debug)。

  3. 手动编辑.Net项目文件以创建x86/x64和调试/发布组合的部分(共4个)。不要使用AnyCPUDllImport将无法与AnyCPU一起工作。仅使用x86/x64。

  4. 手动编辑.Net项目文件输出路径,使其与上述Win32/x64目录相同。这将允许DllImport查找DLL,因为DLL/EXE共享同一目录。您可以选择将DLL放入可发现目录或在DllImport中放入路径,但当您使用两个DLL(32/64)时,这是有问题的。