在虚幻引擎

时间:2018-03-08 11:42:31

标签: c++ unreal-engine4

我按照本教程中的步骤进行操作:

https://wiki.unrealengine.com/How_to_Link_External_C_Libraries_.dll_.lib_With_Your_Project_%26_Package_With_Game,_Fast_And_Easy

我能够连续引用外部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 ++控制台客户端相同的托管库而不是虚幻引擎,一切正常。

知道如何解决这个问题吗?

1 个答案:

答案 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开发人员来说有点奇怪,这就是为什么我不确定这个部分)

希望有所帮助