Example #1
0
    /// <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();
    }