C ++插件无法延迟加载dll

时间:2018-02-14 02:23:51

标签: c++ unity3d visual-c++

我正在将Nvidia Blast桥接到Unity,当PhysX尝试延迟加载PhysX3CommonDEBUG_x64.dll时,我遇到了以下错误:

Unhandled exception at 0x00007FFDD7743FB8 (KernelBase.dll) in Unity.exe: 
0xC06D007E: Module not found (parameters: 0x00000000005FC5B0).`

我能够将这个桥接程序作为一个独立的控制台应用程序运行(在更改项目类型之后),但在Unity内部运行PhysX初始化会导致崩溃(这里是Unity的堆栈跟踪):

0x00007FFF4F543FB8 (KERNELBASE) RaiseException
0x00007FFEF0840835 (PhysX3DEBUG_x64) [f:\dd\vctools\delayimp\delayhlp.cpp:323] __delayLoadHelper2 
0x00007FFEF0669011 (PhysX3DEBUG_x64) _tailMerge_physx3commondebug_x64_dll
0x00007FFEF051CDA4 (PhysX3DEBUG_x64) [c:\users\jesse\documents\github\physx-3.4\physx_3.4\source\physx\src\npfactory.cpp:67] physx::NpFactory::NpFactory
0x00007FFEF051D6ED (PhysX3DEBUG_x64) [c:\users\jesse\documents\github\physx-3.4\physx_3.4\source\physx\src\npfactory.cpp:122] physx::NpFactory::createInstance
0x00007FFEF0545721 (PhysX3DEBUG_x64) [c:\users\jesse\documents\github\physx-3.4\physx_3.4\source\physx\src\npphysics.cpp:269] physx::NpPhysics::createInstance
0x00007FFEF0544DAA (PhysX3DEBUG_x64) [c:\users\jesse\documents\github\physx-3.4\physx_3.4\source\physx\src\npphysics.cpp:831] PxCreateBasePhysics
0x00007FFF18D37FA3 (Fractre) [c:\users\jesse\documents\github\blast\compiler\fractre\fractre.cpp:60] Initialize 

我可以定义确认PhysX3CommonDEBUG_x64.dll和所有其他dll都存在于插件目录中(如Unity所期望的那样),并且当它们丢失时会有投诉,但现在它们已被解决了。

我还运行了Window's System File Checker,但没有发现完整性问题。

2 个答案:

答案 0 :(得分:0)

  

确认插件目录中存在PhysX3CommonDEBUG_x64.dll和所有其他dll(如Unity所期望的那样)

Unity期望的并不重要。当您使用/DELAYLOAD链接器标志与本机DLL链接时,不是Unity谁正在加载该DLL - Windows确实如此。

关于DLL搜索顺序的

Here’s a documentation。您可以调用a special API来指定自定义DLL位置但小心处理,如果有人会欺骗您的应用加载该DLL的黑客版本而不是正确的DLL,可能会产生安全后果。

结合其他笔记。确保您使用的是正确的体系结构,即Unity项目和PhysX都是64位。还要确保PhysX3CommonDEBUG依赖的任何DLL也可用于LoadLibrary。

答案 1 :(得分:0)

以下三种有效的解决方案(自PhysX 4.1起):

  • 静态构建PhysX
  • 从其CMake中删除DELAYLOAD/。
  • 自行加载需要延迟加载的库。只需导入kernel32 LoadLibrary(或Unix上的dlopen / close)并在少数几个库中调用它,然后再调用将要加载的函数即可。