生成.NET包装程序需要源代码吗
Is source code required to build a .NET wrapper?
构建.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
(
- 但是除了了解编译器设置(用于查找调用约定、参数封送处理信息等(和PE检查器(用于验证导出的函数至少存在于要加载的DLL中(之外,还需要C/C++项目的头文件(
- 如果您正在为
AnyCPU
编译C#/.NET代码,请不要忘记确保为所有功能同时提供x86和x64本机dll(提示:在C#DllImport中使用32位或64位dll(
- 如何使用C++读取另一个程序中的源代码输出
- 生成.NET包装程序需要源代码吗
- 如何在 c++ 生成器 6 中从应用程序源代码创建 dll
- 给定程序计数器,在共享库中查找源代码行
- 内部源代码 - 在链接列表实现中插入元素上的删除会破坏整个应用程序
- 如何使用HDF5源代码编译c程序
- 如何将混合(asm,C++)源代码编译为32位程序
- QTCreator GUI应用程序中包含窗口基源代码并在代码中打开
- gcc linker - .obj dump 具有混合源代码程序集,但在 .elf 中链接时没有
- 在不重新编译源代码的情况下更改C++(C)程序中定义的数字
- QT应用程序崩溃但不容易复制,我捕获了转储堆栈以及如何通过堆栈找到源代码
- C++程序行为取决于源代码文件集
- 如何在Linux中编译DEC UNIXv4.0应用程序源代码
- 创建像Linux "df"这样的实用程序,基于此实用程序的源代码
- visualstudio从源代码构建应用程序
- 如何在没有源代码的tcp服务器应用程序中查找错误
- 如何从源代码编译使用头文件的应用程序
- 是否可以在其他调试器(如ollydbg、windbg)中使用源代码调试vc发布程序
- 如何将 Open GL 驱动程序中的分段错误追溯到我的源代码
- 如果程序在源代码中使用较短的名称,它是否更有效率