我按照本教程中的步骤进行操作:
我能够连续引用外部c ++库,项目编译得很好。但是,在运行时,当我从外部库实例化一个对象时,我收到以下错误:
UE4Editor.exe中的0x00007FFD7244FD31(mscordacwks.dll)抛出异常:0xC0000005:访问冲突读取位置 0x0000000000000000。发生了缺少源信息 调试此模块的信息
并且堆栈是:
mscordacwks.dll!ClrDataAccess :: EnumMemDumpAllThreadsStack(枚举 CLRDataEnumMemoryFlags)未知非用户代码。符号已加载。 mscordacwks.dll!ClrDataAccess :: EnumMemoryRegionsWorkerMicroTriage(枚举 CLRDataEnumMemoryFlags)未知非用户代码。符号已加载。 mscordacwks.dll!ClrDataAccess :: EnumMemoryRegionsWrapper(枚举 CLRDataEnumMemoryFlags)未知非用户代码。符号已加载。 mscordacwks.dll!ClrDataAccess :: EnumMemoryRegions(结构 ICLRDataEnumMemoryRegionsCallback,unsigned int,enum CLRDataEnumMemoryFlags)未知非用户代码。符号已加载。 dbgcore.dll!GenGetProcessInfo(unsigned long,struct _MINIDUMP_STATE ,struct _INTERNAL_PROCESS,struct _LIST_ENTRY *)未知非用户 码。符号已加载。 dbgcore.dll!MiniDumpProvideDump()未知 非用户代码。符号已加载。 dbgcore.dll!MiniDumpWriteDump() 未知的非用户代码。符号已加载。 UE4Editor-Core.dll!00007ffdb17e95fb()未知未加载符号。 UE4Editor-Core.dll!00007ffdb17ded6a()未知未加载符号。 UE4Editor-Core.dll!00007ffdb17d2865()未知未加载符号。 UE4Editor-Core.dll!00007ffdb17e0864()未知未加载符号。 [外部代码]带注释的框架
发生错误的行:
CSharpClassExposer* scharpClassExposer = nullptr;
scharpClassExposer = new CSharpClassExposer();
我引用的外部库是C ++ CLI(托管C ++),它进一步包装了C#dll,我确信它与此有关。但是,在我的单独测试项目中,我使用与本机c ++控制台客户端相同的托管库而不是虚幻引擎,一切正常。
知道如何解决这个问题吗?
答案 0 :(得分:1)
当我调用外部库的基本方法/函数/构造函数时,我遇到了与你相同的问题(我从Windows核心dll中得到例外)。
我必须告诉引擎必须加载哪个DLL,对应于你给数组{.1}的.lib
PublicAdditionalLibraries
是您可以从Build.cs访问的另一个数组,您必须使用要链接的每个.dll填充它。
我的Build.cs中有类似的东西:
PublicDelayLoadDLLs
然后,当您的Module加载时,您必须告诉引擎它必须加载哪个DLL。例如,在PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath, "myExternalLiblib"));
PublicDelayLoadDLLs.Add("myExternalLib.dll");
方法中,您必须设置“库”文件夹
void MyModule::StartupModule()
然后要求加载库:
FString AbsPath =
FileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*MyLibPath);
FPlatformProcess::AddDllDirectory(AbsPath)
当我使用一些外部库方法时,这些步骤修复了抛出的异常。
如果我很好理解我在虚幻论坛上发现的内容,引擎使用.lib编译并知道哪个函数存在,但需要.dll动态加载最终可执行文件中未包含的所有依赖项。 (对于cpp开发人员来说有点奇怪,这就是为什么我不确定这个部分)
希望有所帮助