You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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项目的DebugRelease输出目录看看,有没有以下文件:

  • 你的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#代码里加一行调试输出:
    Console.WriteLine($"Current working directory: {Directory.GetCurrentDirectory()}");
    
    运行GameMaker测试后,在控制台(如果GameMaker允许显示控制台)或日志里查看路径,确保所有DLL都在这个路径下

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

火山引擎 最新活动