生成.NET包装程序需要源代码吗

Is source code required to build a .NET wrapper?

本文关键字:源代码 程序 NET 包装 生成      更新时间:2023-10-16

构建.NET包装器需要C++源代码还是静态库*.lib文件就足够了?

我们计划使用SWIG。

谢谢。

w.r.t.您提出的关于静态库*.lib的问题:

构建.NET包装器需要C++源代码还是静态库*.lib文件就足够了?

我怀疑你是否真的打算包装静态库:静态链接库通常不可重新分发,也不可移植(例如,闭源静态库的作者需要在每次出现新的受支持的编译器时构建它们,例如,你不能将GCC库与VisualC++2017一起使用,x64 VisualC++2017库与x86 VisualC++2015项目不兼容(-以及即使您将CCD_ 3加载到进程的内存中并跳转到lib映像中的已知函数地址,它会立即中断,因为静态库的代码将引用某些尚未重新定位的内存地址(例如字符串常量(-如果你幸运,你会遇到segfault(或Windows上的"访问违规"(崩溃(如果没有,它肯定会在被检测到之前破坏进程的内存空间(。

.NET Framework和Windows上的.NET中的p/Invoke(即使用[DllImport](仅支持DLL(动态链接库(,而不支持静态链接库。

如果本机代码可以作为COM对象使用,或者可以通过OLE、WMIC、ADSI等平台功能访问,您也可以调用本机代码,等等(假设您的代码的进程与您要调用的本机代码是相同的ISA,因为它仍然会加载到您的进程中,这就是为什么您不能使用64位Office Excel来打开只有32位OLE-DB或ODBC驱动程序可用的数据库(。

当一个库作为*.lib可用时,您需要首先制作自己的本机主机-一个简单的C/C++Win32(PE(EXE或DLL,从该*.lib重新导出所有有用的函数就足够了-因为这样这些导出就可以通过C#/.NET.导入

但总的来说:

  • 如果要将COM对象导出到.NET,则不需要源代码文件(*.c*.cpp(或头文件(*.h*.hpp(,只需要编译器将为您生成的IDL文件或*.tlb(Type lib(
  • 如果您的本机代码也可以通过其他平台功能获得,如OLE、ActiveX、COM Automation(IDispatch(、ODBC、OLE-DB、ADSI、WMI等,那么您就不会使用[DllImport],并且这些平台都提供标准接口(如ODBC和OLE-DB(
  • 但一般来说,不需要源代码(即*.c*.h文件(来围绕从本机DLL导出并使用[DllImport]导入.NET的本机代码创建.NET包装。
    • 但是除了了解编译器设置(用于查找调用约定、参数封送处理信息等(和PE检查器(用于验证导出的函数至少存在于要加载的DLL中(之外,还需要C/C++项目的头文件(*.h(
  • 如果您正在为AnyCPU编译C#/.NET代码,请不要忘记确保为所有功能同时提供x86和x64本机dll(提示:在C#DllImport中使用32位或64位dll(