nic*_*man 8 c# c++ dll language-interoperability wrapper
我正在尝试在OpenTK中使用SPARK粒子系统.
我的项目包含文件夹中的头文件,只有两个头文件只包含其他文件,文件夹也包含源文件.
到目前为止,我已尝试了几种方法,但对我来说没有任何效果,这些都是我尝试过的:
这是在你的C++项目中编写一些代码,它构建了dll,然后DllImport在C#中使用了属性(显然需要using System.Runtime.InteropServices;).我发现这种方法不适用于类很难,它只适用于类外的方法,因此这种方法无效.
这是编写一个包含指向原始类的指针的类.我发现实际上困难来自于从托管代码调用非托管代码(没有自动内存管理),这就是为什么需要包装类,这就是为什么你必须重新定义方法的签名并让它们调用原始方法.
当然这有一些优点,比如以更好的方式命名类和方法,但是库是如此之大,所以你可以看到它的努力.
这是一种很好的方法,特别是对于xInterop ++.我对此非常乐观,并认为它会起作用,它说"给我.h文件和dll,我将为你构建.NET dll".很好,但这样做会给出错误; 简单来说:
您必须确保.h文件和dll是一致的,并且该库在C++项目中工作.
我已经尝试了几件事来处理这个错误:
_declspec(dllexport).这是我被卡住的地方,这些是我得到的链接器错误:
main.obj:错误LNK2019:未解析的外部符号"void __cdecl SPK :: swapParticles(类SPK :: Particle&,类SPK :: Particle&)"(?swapParticles @ SPK @@ YAXAAVParticle @ 1 @ 0 @ Z)在函数"private:void __thiscall SPK :: Pool :: swapElements(class SPK :: Particle&,class SPK :: Particle&)"(?swapElements @?$ Pool @ VParticle @ SPK @@@ SPK @@ AAEXAAVParticle @ 2 @ 0 @ Z)main.obj:错误LNK2001:未解析的外部符号"unsigned int SPK :: randomSeed"(?randomSeed @ SPK @@ 3IA)main.obj:错误LNK2001:未解析的外部符号"unsigned long const SPK :: NO_ID" (?NO_ID @ SPK @@ 3KB)main.obj:错误LNK2001:未解析的外部符号"public:static float const*const SPK :: Transformable :: IDENTITY"(?IDENTITY @ Transformable @ SPK @@ 2QBMB)
这是产生这些错误的代码:
#include "Extensions/Emitters/SPK_RandomEmitter.h"
using namespace SPK;
int main()
{
RandomEmitter e;
e.changeFlow(6);
e.getFlow();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以这是我的问题,我很抱歉解释太多,但我已经做了三天搜索而没有找到任何解决方案.
图书馆非常大,所以自动解决方案是必须的.
这是一个非常非常不友好的C++库,必须与之互操作.抓住pinvoke可以工作的想法,C++类需要C++/CLI包装器.有很多类有许多小方法.图书馆依赖于构图来产生效果,因此任何尝试与少数上帝类进行互操作的方法都是一条死路.
最重要的危害是它严重依赖于多重继承.在.NET中不支持,这将打败任何自动生成包装器的工具.另请注意,它仅支持OpenGL渲染,而不是Windows上非常流行的图形API.
该库很有吸引力,已经存在了很长一段时间,但是还没有人成功将它移植到.NET.这并不奇怪.在我看来,你没有机会.只有重写才能奏效.
PInvoke 是实现您想要的功能的方法。只要您知道函数签名,您是否拥有该 DLL 的代码并不重要。
查看来自 MSDN 和代码项目的这些文章,其中涵盖了 PInvoke 的基础知识:
编辑: 有些工具可能可以为您生成 DllImport 签名。我自己还没有尝试过这些。看一看:
希望有帮助。
| 归档时间: |
|
| 查看次数: |
1510 次 |
| 最近记录: |