在 Unity 中使用 x64 c++ dll 可以"Is not a valid Win32 application error"

Using x64 c++ dll in Unity gives "Is not a valid Win32 application error"

本文关键字:not Is Win32 error application valid 可以 Unity x64 dll c++      更新时间:2023-10-16

我想做的

我正在尝试使用Unity 64bits中的某些点云库(PCL)功能。为此,我像本教程中的解释一样进行,该教程涉及使用Unity的OpenCV库。

我做了什么以及我得到的问题

因此,我安装了PCL库(V1.8,X64),将其链接到Visual Studio C 项目,并使用它获得了一个简单的功能(库的入门示例)。

然后,我将该项目编译为X64版本的DLL,我包含在资产/插件文件夹中的Unity以及PCL Release DLL中。

最后,我使用以下几行将DLL加载为Unity,并使MySimplefunction可用于C#脚本。

[DllImport("PCLToolsForUnity")] 
internal static extern int MySimpleFunction();

问题是,当我运行C#脚本调用mySimpleFunction()时,Unity显示以下错误:

Failed to load 'Assets/Plugins/PCLToolsForUnity.dll' with error '%1 is not a valid Win32 application.

我已经检查并尝试了

我读到,这可能是由32位和64位DLL和应用程序混合而引起的,但是我的Unity安装是64位,以及我包括的DLL(我什至使用dumpbin /headers命令检查)。所以我什至不知道为什么Unity期望我的DLL成为Win32申请。

我还检查了DLL的路径中没有空间,因为我阅读这可能是造成此错误的另一个原因。

事先,我使用没有库的C 项目尝试了所有这些,这很好。因此,这可能是由链接的库

引起的

对可能导致此错误以及如何解决的想法?


编辑

我正在使用X64机器。

经过更多的测试,似乎问题是我的DLL本身。当我使用以下命令运行任何函数时:C:WindowsSysWOW64rundll32.exe PCLToolsForUnity.dll, testFunction,我的错误与Unity相同:PCLToolsForUnity.dll is not a valid Win32 application

我还发现了"打破"我的DLL的行。我导出的功能之一是:

PCLTOOLSFORUNITY_API int pcdWrite(void)
{
pcl::PointCloud<pcl::PointXYZ> cloud;
// Fill in the cloud data
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize(cloud.width * cloud.height);
for (size_t i = 0; i < cloud.points.size(); ++i)
{
    cloud.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
    cloud.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
    cloud.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);
std::cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." << std::endl;
for (size_t i = 0; i < cloud.points.size(); ++i)
    std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;
return (0);

}

我注意到,如果我评论了pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);行并重新编译我的DLL,那么它可以运行DLL的功能。在没有此行的情况下编译DLL时,我可以从中调用功能,并且可以正常工作。

我检查了我链接到该项目的库,对我来说似乎还不错,所以仍然不知道我的问题从何而来。我希望这些新信息会有所帮助。

我终于找到了这一点的原因。

这实际上是链接不良的问题。PCL使用OpenNi库,我的变量路径链接到该库的32位版本,而不是64位。

对于看到此问题的未来用户,您还可以发现哪个.dll是x86 vs x64,with with:https://github.com/lucasg/dependendencies

此工具仍在维护中。

在我的情况下,此错误来自我的.dll从操作系统其他地方抓取32位freetype依赖性。只需使用我的自定义.dll解决该问题。