/// <summary> /// 编译DLL /// </summary> static public void GenDllByMono(string dataPath, string outPath) { //这里是引入unity所有引用的dll var u3dUI = EditorApplication.applicationContentsPath + @"\UnityExtensions\Unity\GUISystem"; var u3dEngine = EditorApplication.applicationContentsPath + @"\Managed\UnityEngine"; if (Directory.Exists(u3dUI) == false || Directory.Exists(u3dEngine) == false) { EditorUtility.DisplayDialog("提示", "u3d根目录不存在,请修改ScriptBiuld_Service类中,u3dui 和u3dengine 的dll目录", "OK"); return; } //编译项目的base.dll EditorUtility.DisplayProgressBar("编译服务", "准备编译dll", 0.1f); //准备工作 var path = outPath + "/Hotfix"; if (Directory.Exists(path)) { Directory.Delete(path, true); } Directory.CreateDirectory(path); string[] searchPath = new string[] { "3rdPlugins", "Code", "Plugins", "Resource" }; for (int i = 0; i < searchPath.Length; i++) { searchPath[i] = IPath.Combine(dataPath, searchPath[i]); } List <string> files = new List <string>(); foreach (var s in searchPath) { var fs = Directory.GetFiles(s, "*.*", SearchOption.AllDirectories).ToList(); var _fs = fs.FindAll(f => { var exten = Path.GetExtension(f).ToLower(); if (f.ToLower().Contains("editor") == false && (exten.Equals(".dll") || exten.Equals(".cs"))) { return(true); } return(false); }); files.AddRange(_fs); } files = files.Distinct().ToList(); for (int i = 0; i < files.Count; i++) { files[i] = files[i].Replace('/', '\\').Trim('\\'); } EditorUtility.DisplayProgressBar("编译服务", "开始整理script", 0.2f); var refDlls = files.FindAll(f => f.EndsWith(".dll")); var baseCs = files.FindAll(f => !f.EndsWith(".dll") && !f.Contains("@hotfix")); var hotfixCs = files.FindAll(f => !f.EndsWith(".dll") && f.Contains("@hotfix")); var tempDirect = "c:/bd_temp"; if (Directory.Exists(tempDirect)) { Directory.Delete(tempDirect, true); } Directory.CreateDirectory(tempDirect); //除去不需要引用的dll for (int i = refDlls.Count - 1; i >= 0; i--) { var str = refDlls[i]; if (str.Contains("iOS") || str.Contains("Android")) { refDlls.RemoveAt(i); } } //去除同名 重复的dll for (int i = 0; i < refDlls.Count; i++) { var copyto = IPath.Combine(tempDirect, Path.GetFileName(refDlls[i])); File.Copy(refDlls[i], copyto, true); refDlls[i] = copyto; } refDlls.Add("System.dll"); refDlls.Add("System.Core.dll"); refDlls.Add("System.XML.dll"); refDlls.Add("System.Data.dll"); //dll1 var u3ddlls1 = Directory.GetFiles(u3dUI, "*.dll", SearchOption.TopDirectoryOnly); foreach (var d in u3ddlls1) { refDlls.Add(d); } //dll2 var u3ddlls2 = Directory.GetFiles(u3dEngine, "*.dll", SearchOption.AllDirectories); foreach (var d in u3ddlls2) { refDlls.Add(d); } // var baseDllPath = outPath + "/hotfix/base.dll"; EditorUtility.DisplayProgressBar("编译服务", "复制编译代码", 0.3f); //为解决mono.exe error: 文件名太长问题 //全部拷贝到临时目录 tempDirect = "c:/bd_temp"; for (int i = 0; i < baseCs.Count; i++) { var copyto = IPath.Combine(tempDirect, Path.GetFileName(baseCs[i])); int count = 1; while (File.Exists(copyto)) { copyto = copyto.Replace(".cs", "") + count + ".cs"; count++; } File.Copy(baseCs[i], copyto); baseCs[i] = copyto.Replace("\\", "/"); } //建立目标目录 var outDirectory = Path.GetDirectoryName(baseDllPath); if (Directory.Exists(outDirectory)) { Directory.Delete(outDirectory, true); } // try { Directory.CreateDirectory(outDirectory); } catch (Exception e) { EditorUtility.ClearProgressBar(); EditorUtility.DisplayDialog("提示", "Unity拒绝创建文件夹,请重试!", "OK"); return; } EditorUtility.DisplayProgressBar("编译服务", "[1/2]开始编译base.dll", 0.4f); //编译 base.dll try { //转换shortname for (int i = 0; i < baseCs.Count; i++) { var cs = baseCs[i]; baseCs[i] = FileNameHelper.GetShortPath(cs); } Build(refDlls.ToArray(), baseCs.ToArray(), baseDllPath); AssetDatabase.Refresh(); } catch (Exception e) { Debug.LogError(e.Message); EditorUtility.ClearProgressBar(); throw; } // EditorUtility.DisplayProgressBar("编译服务", "[2/2]开始编译hotfix.dll", 0.7f); var dependent = outDirectory + "/dependent"; Directory.CreateDirectory(dependent); //将base.dll加入 refDlls.Add(baseDllPath); //编译hotfix.dll var outHotfixDirectory = outPath + "/hotfix/hotfix.dll"; try { //转换shortname for (int i = 0; i < hotfixCs.Count; i++) { var cs = hotfixCs[i]; hotfixCs[i] = FileNameHelper.GetShortPath(cs); } Build(refDlls.ToArray(), hotfixCs.ToArray(), outHotfixDirectory); AssetDatabase.Refresh(); } catch (Exception e) { Debug.LogError(e.Message); EditorUtility.ClearProgressBar(); throw; } //拷贝依赖的dll // foreach (var f in refDlls) // { // if (File.Exists(f) ==false) // { // continue; // } // var fn = Path.GetFileName(f); // var outpath = IPath.Combine(dependent, fn); // File.Copy(f,outpath,true); // } EditorUtility.DisplayProgressBar("编译服务", "清理临时文件", 0.9f); Directory.Delete(tempDirect, true); EditorUtility.ClearProgressBar(); }