C++/CLI对接C#库用于GameMaker时的System.Text.Json依赖加载失败问题
C++/CLI对接C#库用于GameMaker时的System.Text.Json依赖加载失败问题
看起来你在给GameMaker做C#库的中间层时踩了跨环境依赖加载的坑,这种混合C++/CLI、C#和第三方库的场景确实容易出这类问题,我来帮你理理最可能的解决方向:
核心问题分析
从错误日志看,CLR在尝试加载System.Text.Json, Version=9.0.0.0时失败了——这个版本对应.NET 9,问题大概率出在依赖的DLL没有被正确部署到GameMaker的运行环境中,或者运行环境缺少对应的.NET Runtime。
具体解决步骤
1. 先检查依赖DLL是否已随项目输出
首先去你的C++/CLI项目的Debug或Release输出目录看看,有没有以下文件:
- 你的
UndertaleProjectMan.dll(C#类库的输出) UndertaleModLib.dll(第三方库)System.Text.Json.dll(版本需为9.0.0.0)- 其他.NET核心依赖DLL(比如
System.Runtime.dll等)
如果这些文件不全,那就是编译/引用设置的问题:
- 右键C++/CLI项目的引用,找到
UndertaleProjectMan,确保「复制本地」设置为True - 对于NuGet包(比如UndertaleModLib、System.Text.Json),同样在引用里检查「复制本地」是否为
True,这样编译时会自动把依赖DLL复制到输出目录
2. 确保GameMaker运行环境能访问所有依赖
GameMaker加载你的C++/CLI DLL时,会从游戏的运行工作目录(一般是游戏打包后的根目录,或测试时的临时目录)寻找依赖DLL。你需要:
- 把输出目录里的所有DLL文件(包括C#类库、第三方库、.NET核心依赖)都复制到GameMaker游戏的运行目录,和你的C++/CLI主DLL放在同一个文件夹里
- 如果你不确定GameMaker的工作目录,可以在C#代码里加一行调试输出:
运行GameMaker测试后,在控制台(如果GameMaker允许显示控制台)或日志里查看路径,确保所有DLL都在这个路径下Console.WriteLine($"Current working directory: {Directory.GetCurrentDirectory()}");
3. 调整C#项目的部署模式(推荐)
如果GameMaker是在没有安装.NET 9 Runtime的机器上运行,最好把C#项目设置为自包含部署,这样会把所有.NET核心库一起打包,不依赖系统安装的Runtime:
- 右键你的C#类库项目 → 属性 → 发布
- 创建新的发布配置文件,选择「文件夹」作为目标
- 在「部署模式」里选择自包含,然后选择对应的目标平台(比如x64,GameMaker一般用64位)
- 发布后,把发布目录里的所有文件复制到C++/CLI项目的输出目录,再一起打包给GameMaker
4. 用绑定重定向解决版本冲突(如果是版本不匹配)
如果你的环境里存在多个版本的System.Text.Json,比如系统里装了.NET 6,而你的项目用了.NET 9,可以通过绑定重定向让CLR自动使用你提供的版本:
- 创建一个和你的C++/CLI DLL同名的配置文件,比如
你的DLL名.dll.config,内容如下:<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> - 把这个配置文件和所有DLL一起放到GameMaker的运行目录
5. 用工具排查加载细节(进阶)
如果还是找不到问题,可以用.NET自带的程序集绑定日志查看器(fuslogvw.exe)来定位具体的加载失败原因:
- 打开
fuslogvw.exe(可以在.NET 9的Runtime目录找到,或通过Windows搜索) - 点击「设置」,选择「记录绑定失败到磁盘」
- 运行GameMaker的测试,然后回到工具,刷新日志,就能看到CLR尝试加载
System.Text.Json时的所有路径和错误信息,精准定位问题
内容来源于stack exchange




