Vue 项目 npm run serve 后页面乱码排查记录
一次本地启动开发服务器后浏览器出现乱码的排查过程,从浏览器设置、编码声明、服务端响应头到项目依赖,理了一遍常见原因。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-07-26 10:15:42 Unity Assembly-CSharp 程序集 编译 调试 asmdef
遇到过一种挺诡异的情况:项目编译正常过,也没报错,但运行的时候某个方法调不到,一查 Assembly-CSharp.dll,发现这个方法体是空的,或者说根本没生成进去。
这种问题如果不注意,可能编辑器里跑着没问题,打个包出来就炸了。
排查下来,根因基本落在几个方向上。
一个很常见的原因就是编译阶段其实有错误,只是你没留意到。Unity 有时候会在 Console 里报错,但因为窗口被折叠或者脚本多了被刷过去,就容易漏掉。某个脚本报错会直接导致这个程序集整体编译失败,那里面自然就有方法体缺失。修掉所有编译错误,再把 Library/ScriptAssemblies 删了让 Unity 重新生成一下,很多时候问题就直接消失了。
这个目录删掉是安全的,Unity 会基于源码重新走一遍编译。
如果项目里用了程序集定义文件(asmdef),也要多看一眼。脚本放在哪个文件夹里,就会被归到对应的程序集。弄错了文件夹,脚本就根本没被编译进 Assembly-CSharp.dll,而是进了别的程序集,或者干脆没进任何程序集。解决方法就是选中脚本,在 Inspector 里看 Assembly Information,确认它归属的程序集是不是你期望的那个。另外,asmdef 文件里的 Assembly Definition References 有没有把依赖的程序集勾上也得检查,漏了依赖,编译虽然可能不报错,但运行时类型找不到,方法体自然就“缺”了。
还有一个容易被忽略的点是条件编译符号。代码里用 #if UNITY_EDITOR 这类预处理指令包住的方法,如果你打包的平台没定义对应符号,那个方法体就直接被裁掉了。这种情况编辑器里跑没问题,一上真机就缺方法。
需要去 Player Settings 的 Scripting Define Symbols 里看看当前平台的符号列表,是不是漏加了什么自定义符号。顺便检查一下脚本里的 #if 条件,有时候会误写或者符号名拼错。
有时并不是逻辑问题,纯粹就是生成的文件坏了。Assembly-CSharp.dll 或者它的调试文件(.mdb / .pdb)损坏,也会导致读不到方法体。可以试着关掉 Unity,把 Temp 和 Library 整个删掉,再重新打开项目让它重新生成一遍。如果还不行,重新导入脚本或者建个新项目把代码迁移过去,基本能排除掉这类缓存/文件损坏的干扰。
定位这种问题的时候,我习惯直接用 dnSpy 之类的工具反编译一下 dll,看看那个方法到底是只有声明没有实现,还是连声明都被裁了。
这能帮你快速判断问题出在编译阶段还是在加载阶段。
如果怀疑是条件编译的问题,就写一个最小复现:新建一个脚本,只放一个简单方法,看它能不能正常出现在 dll 里。比如:
public class Test { public void MissingMethod() => UnityEngine.Debug.Log("This method should exist."); }
这个脚本如果没问题,那基本就是原来脚本所处的上下文(程序集归属、条件符号、依赖)有问题。
查程序集依赖的时候,也可以写个编辑器小工具直接打印当前所有程序集的信息,比手动翻 Inspector 快:
using UnityEditor; using UnityEditor.Compilation; using System.Linq;
public static class AssemblyDebugger { [MenuItem("Tools/Debug Assemblies")] public static void LogAssemblies() { var assemblies = CompilationPipeline.GetAssemblies(); foreach (var assembly in assemblies) { UnityEngine.Debug.Log($"Assembly: {assembly.name}"); UnityEngine.Debug.Log($"Path: {assembly.outputPath}"); UnityEngine.Debug.Log($"Source Files: {assembly.sourceFiles.Length}"); UnityEngine.Debug.Log($"References: {string.Join(", ", assembly.assemblyReferences.Select(r => r.name))}"); } } }
跑一下这个菜单项,就能看到每个程序集具体包含了哪些源文件、引用了哪些其他程序集。
对照着看看问题脚本是不是没在里面,或者它的依赖有没有挂上。
回过头看,这类问题的排查顺序一般是先保证编译零错误,再确认脚本所在程序集是否正确、依赖是否完整,接着检查条件编译符号有没有缺失,最后再去怀疑文件完整性。很多时候,清一遍 Library 就能解决,别在上面绕太久。如果这些都没用,那就要把 Unity 版本、asmdef 配置、控制台报错信息带上,进一步分析了。
一次本地启动开发服务器后浏览器出现乱码的排查过程,从浏览器设置、编码声明、服务端响应头到项目依赖,理了一遍常见原因。
碰到 ./ndt: error while loading shared libraries 这种报错,从确认库文件是否存在、配置 LD_LIBRARY_PATH,到装包、ldd 查依赖、ldconfig 重建缓存,一次说清排查顺序。
跑单测突然报 Command line is too long,大多数情况在 Run Configuration 里勾一个选项就完事。这里把原因和几种方案一起记一下。
一个关于 NumPy 导入报错的排查清单,覆盖常见原因和顺手能试的修法。
当Vue2项目遇上SSE服务器消息推送,Network面板却“悄无声息”?这并非偶然!我们深入探究了导致Event-Stream数据流无法直观显示的多种可能性,包括HTTP响应头、EventSource配置、Vue开发服务器代理及Chrome的调试机制。一同抽丝剥茧,定位问题,让你的SSE数据无所遁形。