将C ++函数公开给C和.Net有哪些步骤?我想在C ++,C和.Net中使用相同的函数名来进行32位和64位构建。
我发布了这个问题和答案,因为我还没有在任何地方找到这些技术。
答案 0 :(得分:0)
步骤如下:
将C ++函数公开为C静态库(.lib)。
使用#pragma
语句将lib函数投影到DLL中。
使用.Net的DllImport
属性公开DLL的功能。
有关示例,请参阅this github project.
步骤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位在函数名称之前需要前导下划线。没有必要的代码,仅#pragma
s。
#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);
}
}
虽然使用这些技术编写代码很简单,但您需要对解决方案和项目文件进行大量编辑。
设置解决方案的正确构建顺序。 DLL将取决于静态库。 .Net项目将取决于DLL。
手动编辑DLL项目文件,将32位和64位DLL构建到单独的目录中(例如Win32 \ Debug,x64 \ Debug)。
手动编辑.Net项目文件,为x86 / x64和Debug / Release(总共4个)的组合创建部分。请勿使用AnyCPU
。 DllImport
将无法使用AnyCPU
。仅使用x86 / x64。
手动将.Net项目文件输出路径编辑为与上面相同的Win32 / x64目录。这将允许DllImport
找到DLL,因为DLL / EXE共享同一目录。 (可选)您可以将DLL放入可发现的目录中或在DllImport中放置路径 - 但是当您使用两个DLL(32/64)时,这会有问题。