如何向.Net公开C静态库
How to Expose C Static Library to .Net?
向C和.Net公开C++函数的步骤是什么?对于32位和64位的构建,我希望在C++、C和.Net中使用相同的函数名。
我之所以发布这个问题和答案,是因为我在任何地方都没有发现这些技术的文档。
步骤为:
-
将C++函数公开为C静态库(.lib)。
-
使用
#pragma
语句将库的函数投影到DLL中。 -
使用.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位函数名之前需要一个前导下划线。无需代码,只需#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和调试/发布组合的部分(共4个)。不要使用
AnyCPU
。DllImport
将无法与AnyCPU
一起工作。仅使用x86/x64。手动编辑.Net项目文件输出路径,使其与上述Win32/x64目录相同。这将允许
DllImport
查找DLL,因为DLL/EXE共享同一目录。您可以选择将DLL放入可发现目录或在DllImport中放入路径,但当您使用两个DLL(32/64)时,这是有问题的。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- C++从另一个类访问公共静态向量的正确方法是什么
- 基于boost的程序的静态链接——zlib问题
- 在静态库中嵌入类方法
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 如何在C++中获得"静态纯虚拟"功能?
- 如何将 cpp 文件中的静态函数公开给其他文件
- 静态包装库的多态迭代器,而不向用户公开库
- 如果基类是公开继承的,那么基类的公共静态函数是否会成为派生类的成员函数
- 静态库接口 (c++) 中未公开的类的名称冲突
- 如何向.Net公开C静态库
- 从闭源库中检索静态指针,不由公共接口公开
- 从静态库公开一个类
- 创建使用Boost ASIO而不公开它的静态库
- Lua包装类-通过DLL向Lua公开c++静态方法