C++ 在非真实引擎中引用外部库时发生运行时错误

C++ 在非真实引擎中引用外部库时发生运行时错误,c++,unreal-engine4,C++,Unreal Engine4,我遵循了本教程中的步骤: < >我能够连续引用外部C++库,并且程序编译得很好。但是,在运行时,当我从外部库实例化一个对象时,会出现以下错误: UE4Editor.exe中0x00007FFD7244FD31(mscordacwks.dll)处引发异常:0xC0000005:访问冲突读取位置 0x0000000000000000。数据库中缺少发生的源信息 此模块的调试信息 堆栈是: mscordacwks.dll!ClrDataAccess::EnumMemDumpAllThreadsStac

我遵循了本教程中的步骤:

< >我能够连续引用外部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,无符号整数,枚举 CLRDataEnumMemoryFlags)未知的非用户代码。已加载符号。 dbgcore.dll!GenGetProcessInfo(无符号长,结构\u最小转储\u状态 ,结构内部进程,结构列表条目*)未知非用户 代码。已加载符号。dbgcore.dll!minidumpProvidedImp()未知 非用户代码。已加载符号。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++控制台客户端,而不是虚构引擎。
知道如何解决这个问题吗?

当我调用外部库的基本方法/函数/构造函数时,我遇到了与您相同的问题(我从Windows core DLL中得到了例外)

我必须告诉引擎必须加载哪个DLL,对应于你给数组的.lib
PublicAdditionalLibraries

publicdayloaddls
是另一个可以从Build.cs访问的数组,您必须用要链接的每个.dll填充它

我的Build.cs中有类似的内容:

PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath,“myexternalib.lib”); publicdayloaddls.Add(“myexternalib.dll”)

然后,当加载模块时,您必须告诉引擎它必须加载哪个DLL。例如,在您的
void MyModule::StartupModule()
方法中,您必须设置Libraries文件夹

FString AbsPath=
FileManager::Get().ConvertToAbsolutionPathForExternalAppForRead(*MyLibPath);
FPlatformProcess::AddDllDirectory(AbsPath)

然后要求加载库:

void*DLLHandle3=FPlatformProcess::GetDllHandle(L“myExternalLib.dll”)

这些步骤修复了我使用某些外部库方法时引发的异常

如果我已经很好地理解了在Unreal论坛上发现的内容,那么引擎将使用.lib编译并知道存在哪个函数,但需要.dll动态加载最终可执行文件中未包含的所有依赖项。(对于cpp开发人员来说有点奇怪,这就是为什么我不确定这部分的原因)


希望它有帮助

当我调用外部库的基本方法/函数/构造函数时,我遇到了与您相同的问题(我从Windows core DLL中得到了例外)

我必须告诉引擎必须加载哪个DLL,对应于你给数组的.lib
PublicAdditionalLibraries

publicdayloaddls
是另一个可以从Build.cs访问的数组,您必须用要链接的每个.dll填充它

我的Build.cs中有类似的内容:

PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath,“myexternalib.lib”); publicdayloaddls.Add(“myexternalib.dll”)

然后,当加载模块时,您必须告诉引擎它必须加载哪个DLL。例如,在您的
void MyModule::StartupModule()
方法中,您必须设置Libraries文件夹

FString AbsPath=
FileManager::Get().ConvertToAbsolutionPathForExternalAppForRead(*MyLibPath);
FPlatformProcess::AddDllDirectory(AbsPath)

然后要求加载库:

void*DLLHandle3=FPlatformProcess::GetDllHandle(L“myExternalLib.dll”)

这些步骤修复了我使用某些外部库方法时引发的异常

如果我已经很好地理解了在Unreal论坛上发现的内容,那么引擎将使用.lib编译并知道存在哪个函数,但需要.dll动态加载最终可执行文件中未包含的所有依赖项。(对于cpp开发人员来说有点奇怪,这就是为什么我不确定这部分的原因)

希望能有帮助