From 3b99c8459ada782d12dd952502e04fa0075a289b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?johnche=28=E8=BD=A6=E9=9B=84=E7=94=9F=29?= Date: Tue, 3 Jan 2017 10:49:33 +0800 Subject: [PATCH] =?UTF-8?q?HOTFIX=5FDEBUG=5FSYMBOLS=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/XLua/Doc/hotfix.md | 10 ++++++++-- Assets/XLua/Src/Editor/Hotfix.cs | 11 ++++++++++- README.md | 6 +++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Assets/XLua/Doc/hotfix.md b/Assets/XLua/Doc/hotfix.md index fec6894..d1cf614 100644 --- a/Assets/XLua/Doc/hotfix.md +++ b/Assets/XLua/Doc/hotfix.md @@ -1,8 +1,14 @@ ## 约束 -为了不影响开发,这个特性默认是不打开的,需要添加HOTFIX_ENABLE宏。打开后由于il和源代码已经对应不上,所以(双击Unity3D日志)代码会定位到错误的地方,调试功能工作也不正常。 +为了不影响开发,这个特性默认是不打开的,需要添加HOTFIX_ENABLE宏。 -热更特性依赖Cecil,添加HOTFIX_ENABLE宏之后,可能会报找不到Cecil。这时你需要到Unity安装目录下找到Mono.Cecil.dll,拷贝到项目里头。 +打开HOTFIX_ENABLE后由于il和源代码已经对应不上,所以(双击Unity3D日志)代码会定位到错误的地方,调试功能工作也不正常。 + +打开HOTFIX_DEBUG_SYMBOLS可以解决il和源代码对应不上的问题,但如果在编辑器下运行过后在修改代码,会报Assembly-CSharp.dll.mdb的写冲突错误。 + +建议的做法是HOTFIX_ENABLE,HOTFIX_DEBUG_SYMBOLS在build手机版本的时候打开,平时编辑器下需要开发补丁的时候打开HOTFIX_ENABLE,开发补丁时需要调试的时候打开HOTFIX_DEBUG_SYMBOLS。 + +热更特性依赖Cecil,添加HOTFIX_ENABLE宏之后,可能会报找不到Cecil。这时你需要到Unity安装目录下找到Mono.Cecil.dll,拷贝到项目里头。而HOTFIX_DEBUG_SYMBOLS则依赖Mono.Cecil.Pdb.dll。 不支持静态构造函数。 diff --git a/Assets/XLua/Src/Editor/Hotfix.cs b/Assets/XLua/Src/Editor/Hotfix.cs index 2fcf7cd..3520c2f 100644 --- a/Assets/XLua/Src/Editor/Hotfix.cs +++ b/Assets/XLua/Src/Editor/Hotfix.cs @@ -127,7 +127,12 @@ namespace XLua //[UnityEditor.MenuItem("XLua/Hotfix Inject In Editor", false, 3)] public static void HotfixInject() { +#if HOTFIX_DEBUG_SYMBOLS + var readerParameters = new ReaderParameters { ReadSymbols = true }; + AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(INTERCEPT_ASSEMBLY_PATH, readerParameters); +#else AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(INTERCEPT_ASSEMBLY_PATH); +#endif init(assembly); if (assembly.MainModule.Types.Any(t => t.Name == "__XLUA_GEN_FLAG")) return; @@ -171,8 +176,12 @@ namespace XLua } } } - +#if HOTFIX_DEBUG_SYMBOLS + var writerParameters = new WriterParameters { WriteSymbols = true }; + assembly.Write(INTERCEPT_ASSEMBLY_PATH, writerParameters); +#else assembly.Write(INTERCEPT_ASSEMBLY_PATH); +#endif Debug.Log("hotfix inject finish!"); } diff --git a/README.md b/README.md index 9aa8784..6028c75 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ xLua为Unity3D增加Lua脚本编程的能力,进而提供代码逻辑增量更 ## xLua的突破 -xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的突破是: +xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是: -* Unity3D全平台热补丁技术,可以运行时把C#实现(整个类,或者单个方法,操作符,属性,事件,构造函数,析构函数,支持泛化)替换成lua实现; +* Unity3D全平台热补丁技术,可以运行时把C#实现(方法,操作符,属性,事件,构造函数,析构函数,支持泛化)替换成lua实现; * 自定义struct,枚举在Lua和C#间传递无C# gc alloc; * 编辑器下无需生成代码,开发更轻量; @@ -36,7 +36,7 @@ luaenv.Dispose(); 1、DoString参数为string,可输入任意合法的Lua代码,本示例在lua里调用C#的UnityEngine.Debug.Log打印了个日志。 -2、一个LuaEnv实例对应Lua虚拟机,处于开销的考虑,建议全局唯一。 +2、一个LuaEnv实例对应Lua虚拟机,出于开销的考虑,建议全局唯一。 C#主动调用lua也很简单,比如要调用lua的系统函数,推荐方式是: -- GitLab