我正在尝试在OpenTK中使用SPARK粒子系统。
我的项目包含文件夹中的头文件,只有两个头文件,这些文件只包含其他文件,文件夹中还包含源文件。
到目前为止,我已经尝试了几种方法,但都没有成功,以下是我尝试过的方法:
1. P/Invoke 在C++项目中编写一些代码,构建dll,然后在C#中使用DllImport属性(显然需要using System.Runtime.InteropServices;)。我很艰难地发现这不适用于类,它只适用于类外的方法,因此这种方法无效。
2. 包装器类
编写一个包含指向原始类的指针的类。我发现,调用非托管代码(没有自动内存管理)从托管代码中引起了困难,这就是为什么需要包装器类的原因,并且这就是您必须重新定义方法签名并让它们调用原始方法的原因。
当然,这样做有优点,比如更好地命名类和方法,但是库非常大,所以您可以看到这方面的努力。
3. 使用自动包装器:
这是一个很好的方法,特别是使用xInterop ++。我真的对此非常乐观,认为它会起作用,它说“给我.h文件和dll,我会为您构建.NET dll”。不错,但这样做会产生一个错误;简而言之:
确保.h文件和dll一致,并且库在C++项目中正常工作。
我尝试了几种方法来解决此错误:
1. 知道dll包含什么:从谷歌和这个网站学到的,难以做到,所以我的尝试失败了。 2. 将头文件放入新项目并进行构建:收到错误,修复后构建项目,然后运行良好。我将dll文件与头文件上传到xInterop。然后它告诉找到的类,但然后会声明未找到任何内容!我搜索并了解到,必须通过使用以下语句标记需要暴露给dll的每个类来告诉编译器需要公开哪些类:_declspec(dllexport)。 3. 我使用查找和替换来修复这个问题,然后再次尝试,显示了类,因此我启动了xInterop,并收到相同的错误。 4. 它要求确保dll有效。在验证文件有效后,我启动了程序,生成了链接器错误。
这就是我卡住的地方,这些是我得到的链接器错误: :错误 LNK2019:未解析的外部符号 "void __cdecl SPK::swapParticles(class SPK::Particle &,class 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) 中被引用 :错误 LNK2001:未解析的外部符号 "unsigned int SPK::randomSeed" (?randomSeed@SPK@@3IA) :错误 LNK2001:未解析的外部符号 "unsigned long const SPK::NO_ID" (?NO_ID@SPK@@3KB) :错误 LNK2001:未解析的外部符号 "public: static float const * const SPK::Transformable::IDENTITY" (?IDENTITY@Transformable@SPK@@2QBMB)
1. P/Invoke 在C++项目中编写一些代码,构建dll,然后在C#中使用DllImport属性(显然需要using System.Runtime.InteropServices;)。我很艰难地发现这不适用于类,它只适用于类外的方法,因此这种方法无效。
2. 包装器类
编写一个包含指向原始类的指针的类。我发现,调用非托管代码(没有自动内存管理)从托管代码中引起了困难,这就是为什么需要包装器类的原因,并且这就是您必须重新定义方法签名并让它们调用原始方法的原因。
当然,这样做有优点,比如更好地命名类和方法,但是库非常大,所以您可以看到这方面的努力。
3. 使用自动包装器:
这是一个很好的方法,特别是使用xInterop ++。我真的对此非常乐观,认为它会起作用,它说“给我.h文件和dll,我会为您构建.NET dll”。不错,但这样做会产生一个错误;简而言之:
确保.h文件和dll一致,并且库在C++项目中正常工作。
我尝试了几种方法来解决此错误:
1. 知道dll包含什么:从谷歌和这个网站学到的,难以做到,所以我的尝试失败了。 2. 将头文件放入新项目并进行构建:收到错误,修复后构建项目,然后运行良好。我将dll文件与头文件上传到xInterop。然后它告诉找到的类,但然后会声明未找到任何内容!我搜索并了解到,必须通过使用以下语句标记需要暴露给dll的每个类来告诉编译器需要公开哪些类:_declspec(dllexport)。 3. 我使用查找和替换来修复这个问题,然后再次尝试,显示了类,因此我启动了xInterop,并收到相同的错误。 4. 它要求确保dll有效。在验证文件有效后,我启动了程序,生成了链接器错误。
这就是我卡住的地方,这些是我得到的链接器错误: :错误 LNK2019:未解析的外部符号 "void __cdecl SPK::swapParticles(class SPK::Particle &,class 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) 中被引用 :错误 LNK2001:未解析的外部符号 "unsigned int SPK::randomSeed" (?randomSeed@SPK@@3IA) :错误 LNK2001:未解析的外部符号 "unsigned long const SPK::NO_ID" (?NO_ID@SPK@@3KB) :错误 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;
}
这就是我的问题,很抱歉我解释得太多了,但我已经搜索了三天也没有找到解决方案。
附言:
这个库非常大,因此自动解决方案是必须的。