You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中C#/C++使用Google Protobuf遇Unsafe程序集找不到异常

问题分析与解决方案:Unity中C++修改后C#数组无输出+System.Runtime.CompilerServices.Unsafe加载失败

错误关联判断

无法加载System.Runtime.CompilerServices.Unsafe程序集的异常,和Debug.Log无输出、数组数据无法显示是直接相关的。Unity的日志系统底层依赖该程序集的实现,一旦程序集加载失败,日志输出会直接失效;同时C#与C++的数组交互逻辑,也会因为底层运行时依赖缺失而中断。


一、先修复程序集加载问题

1. 通过Package Manager安装/验证

  • 打开Unity的Package Manager,搜索System.Runtime.CompilerServices.Unsafe,确认是否已安装。未安装的话直接安装,版本要匹配Unity编辑器的.NET版本(比如Unity 2022对应.NET 6,选兼容版本)。
  • 已安装的话,检查Packages目录下该包的Runtime文件夹里,System.Runtime.CompilerServices.Unsafe.dll是否存在;同时在Player Settings > Other Settings里,把Api Compatibility Level设为对应.NET版本(如.NET 6或.NET Framework 4.x)。

2. 手动添加程序集(Package Manager安装失败时)

  • 从NuGet下载对应版本的System.Runtime.CompilerServices.Unsafe包,解压后取出lib/netstandard2.0或Unity兼容版本的System.Runtime.CompilerServices.Unsafe.dll。
  • 把dll放到Unity项目的Assets/Plugins目录,在Inspector里设置Platform Settings:勾选目标平台(Windows/Android等),CPU设为Any CPU,Load Type设为Runtime。

二、排查C++与C#数组交互的实现问题

修复程序集后,还要确认数组传递逻辑是否因C++代码修改而出错:

1. C#端代码检查

假设你的C#代码是这类实现:

[DllImport("YourCppDllName")]
private static extern void SendArrayToCpp(int[] array, int length);

void Start()
{
    int[] testArray = new int[] {1,2,3,4};
    Debug.Log("Sending array: " + string.Join(",", testArray));
    SendArrayToCpp(testArray, testArray.Length);
}
  • 确认DllImport的库名和生成的C++ dll文件名完全一致(注意Windows是.dll,Linux是.so,macOS是.dylib)。
  • 检查函数签名是否和C++端完全匹配。

2. C++端代码检查

C++端必须用extern "C"避免名称修饰,且函数签名要对应:

extern "C" __declspec(dllexport) void SendArrayToCpp(int* array, int length)
{
    for(int i=0; i<length; i++)
    {
        printf("Received element: %d\n", array[i]);
    }
}
  • 检查修改后的C++代码是否改动了函数名、参数类型,是否存在空指针访问、内存越界的情况。

3. Unity配置检查

  • 确认Player Settings > Other Settings > Scripting Backend是IL2CPP或.NET;如果用IL2CPP,要开启Allow unsafe code。
  • IL2CPP后端的话,检查Linker Settings:如果开了Managed Stripping Level,要把System.Runtime.CompilerServices.Unsafe加入Preserve Assemblies列表,避免被剥离。

三、验证步骤

  1. 先修复程序集问题,运行场景看Debug.Log是否恢复输出——恢复的话,说明之前的无输出是程序集缺失导致的。
  2. 日志正常后,测试数组传递:C端加printf输出,或者C#端接收C的返回结果,确认数据是否正确传递。
  3. 如果还是没数据,重点排查C++代码的修改点,看是否破坏了数组指针的处理逻辑。

内容的提问来源于stack exchange,提问作者Fl0ris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:10:28