Пример #1
0
        /// <summary>
        /// 移动到目录文件
        /// </summary>
        /// <param name="grpcDllPath"></param>
        public static string ToResultDic(string shortFileName, string grpcDllPath, string nameSpace, out string errorMsg)
        {
            errorMsg = string.Empty;
            try
            {
                #region 移动Dll
                var resultDic = GrpcGlobal.GenResultDic(shortFileName);

                Utility.MakeDir(Path.Combine(resultDic, net45Fold));
                Utility.MakeDir(Path.Combine(resultDic, net46Fold));
                //Utility.MakeDic(Path.Combine(resultDic, net47Fold));
                Utility.MakeDir(Path.Combine(resultDic, netcoreFold));

                var net45File = new FileInfo(grpcDllPath.Replace("net46", net45Fold));
                var net46File = new FileInfo(grpcDllPath);
                //var net47File = new FileInfo(grpcDllPath.Replace("net46", "net47"));
                var netcore20 = new FileInfo(grpcDllPath.Replace("net46", netcoreFold));

                File.Copy(net45File.FullName, Path.Combine(resultDic, net45Fold, nameSpace + ".dll"));
                File.Copy(net46File.FullName, Path.Combine(resultDic, net46Fold, nameSpace + ".dll"));
                //File.Copy(net47File.FullName, Path.Combine(resultDic, net47Fold, nameSpace + ".dll"));
                File.Copy(netcore20.FullName, Path.Combine(resultDic, netcoreFold, nameSpace + ".dll"));
                #endregion


                #region 移动Xml
                var net45XmlFile = new FileInfo(grpcDllPath.Replace("net46", net45Fold).Replace(".dll", ".xml"));
                var net46XmlFile = new FileInfo(grpcDllPath.Replace(".dll", ".xml"));
                //var net47XmlFile = new FileInfo(grpcDllPath.Replace("net46", "net47").Replace(".dll", ".xml"));
                var netcore20Xml = new FileInfo(grpcDllPath.Replace("net46", netcoreFold).Replace(".dll", ".xml"));

                File.Copy(net45XmlFile.FullName, Path.Combine(resultDic, net45Fold, nameSpace + ".xml"));
                File.Copy(net46XmlFile.FullName, Path.Combine(resultDic, net46Fold, nameSpace + ".xml"));
                //File.Copy(net47XmlFile.FullName, Path.Combine(resultDic, net47Fold, nameSpace + ".dll"));
                File.Copy(netcore20Xml.FullName, Path.Combine(resultDic, netcoreFold, nameSpace + ".xml"));
                #endregion

                #region 移动Config
                var genFold = GrpcGlobal.GenFolder;

                var fmConfigFold = Path.Combine(genFold, "fmconfigs");
                var fmConfigs    = Directory.GetFiles(fmConfigFold);


                var newNet45ConfigFold = Path.Combine(resultDic, net45Fold, dllconfigFold);
                Utility.MakeDir(newNet45ConfigFold);

                var newNet46ConfigFold = Path.Combine(resultDic, net46Fold, dllconfigFold);
                Utility.MakeDir(newNet46ConfigFold);

                //var newNet47ConfigFold = Path.Combine(resultDic, net47Fold, dllconfigFold);
                //Utility.MakeDic(newNet47ConfigFold);

                foreach (var fmConfig in fmConfigs)
                {
                    var file = new FileInfo(fmConfig);
                    File.Copy(fmConfig, Path.Combine(newNet45ConfigFold, file.Name));
                    File.Copy(fmConfig, Path.Combine(newNet46ConfigFold, file.Name));
                    //File.Copy(fmConfig, Path.Combine(newNet47ConfigFold, file.Name));
                }

                var coreConfigFold = Path.Combine(genFold, "coreconfigs");
                var coreConfigs    = Directory.GetFiles(coreConfigFold);

                var newCoreConfigFold = Path.Combine(resultDic, netcoreFold, dllconfigFold);
                Utility.MakeDir(newCoreConfigFold);

                foreach (var coreConfig in coreConfigs)
                {
                    var file = new FileInfo(coreConfig);
                    File.Copy(coreConfig, Path.Combine(newCoreConfigFold, file.Name));
                }
                #endregion

                return(resultDic);
            }
            catch (Exception ex)
            {
                errorMsg = ex.Message;
            }
            return(string.Empty);
        }
Пример #2
0
        /// <summary>
        /// 生成异步或者通过的代码文件
        /// </summary>
        /// <param name="fullFilePathList"></param>
        public static bool Execute(string filePath, EnumGrpcGenType genType, string tempKey, out string csNamespace, out string errorMsg, out string resultDic)
        {
            csNamespace = string.Empty;
            errorMsg    = string.Empty;
            resultDic   = string.Empty;
            if (!Utility.CheckFilePath(filePath))
            {
                errorMsg = "没有文件可以生成";
                return(false);
            }

            var csFiles = GenUtilityOrigin.GenGrpc(filePath, out errorMsg);

            if (!string.IsNullOrEmpty(errorMsg))
            {
                return(false);
            }

            if (csFiles == null || csFiles.Length == 0)
            {
                errorMsg = "proto 协议文件有异常";
                return(false);
            }
            resultDic = csFiles[0].Directory.FullName;

            // 生成配置文件
            var fmConfigs = GenUtilityOrigin.MakeFmConfig();

            if (fmConfigs != null && fmConfigs.Count > 0)
            {
                var fmConfigDic = Path.Combine(resultDic, "fmconfigs");
                Utility.MakeDir(fmConfigDic);

                foreach (var configPair in fmConfigs)
                {
                    var dllconfigFileName = Path.Combine(fmConfigDic, configPair.Key);
                    Utility.WriteNewFile(dllconfigFileName, configPair.Value);
                }
            }

            var coreConfigs = GenUtilityOrigin.MakeCoreConfig();

            if (fmConfigs != null && fmConfigs.Count > 0)
            {
                var coreConfigDic = Path.Combine(resultDic, "coreconfigs");
                Utility.MakeDir(coreConfigDic);

                foreach (var configPair in coreConfigs)
                {
                    var dllconfigFileName = Path.Combine(coreConfigDic, configPair.Key);
                    Utility.WriteNewFile(dllconfigFileName, configPair.Value);
                }
            }


            //如果只需要生成原生的,就直接返回
            if (genType == EnumGrpcGenType.Origin)
            {
                return(true);
            }

            #region 第一次编译
            // 每次生成都只能生成一次文件夹路径
            var fileName    = new FileInfo(filePath).Name;
            var projDicPath = GrpcGlobal.GenProjDic(fileName);
            if (string.IsNullOrEmpty(projDicPath))
            {
                errorMsg = "Create gen temp folder error,may u have already open it!";
                return(false);
            }

            // 组织这些文件成为一个project.xml文件
            var projXml     = BuildGrpcProject.MakeProj(csFiles, "grpcProj");
            var projXmlPath = Path.Combine(projDicPath, "grpcProj.csproj");
            Utility.WriteNewFile(projXmlPath, projXml);

            // 拷贝json文件
            GrpcGlobal.MoveProjectAsset(fileName);

            // 调用MSBuild生成这个项目
            var msbuildPath = GrpcGlobal.MsBuildPath();
            if (string.IsNullOrEmpty(msbuildPath))
            {
                errorMsg = "VS2017安装目录中找不到MSBuild.exe,或者安装的VS2017目录没有2017标识,或者VS2017从未打开过, 请检查注册表 \r\n Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache";
                return(false);
            }

            // 调用restore
            Utility.RunCmd("dotnet", "restore", projDicPath, out errorMsg);

            // 为防止有的客户端路径中包含空格影响参数的设置
            // 设置运行的目录在客户端当前目录调用MSBuild
            Utility.RunProcess(msbuildPath, projDicPath, "grpcProj.csproj");
            #endregion

            #region  制到专门的路径
            var net46Fold   = Path.Combine(projDicPath, @"bin\Debug\net46");
            var assemblyDic = GrpcGlobal.GetLoadAssemblyDic(fileName, tempKey);
            Utility.Copy(net46Fold, assemblyDic);
            #endregion

            // 获取命名空间
            var grpcDllPath = Path.Combine(assemblyDic, "net46", "grpcProj.dll");

            // 创建一个ClientManager
            var proxyCode     = GenUtilityOrigin.GenAsyncProxyCs(grpcDllPath, out csNamespace);
            var proxyFilePath = Path.Combine(resultDic, "ClientManager.cs");
            Utility.WriteNewFile(proxyFilePath, proxyCode);

            #region 第二次编译
            // 每次生成都只能生成一次文件夹路径
            fileName    = new FileInfo(filePath).Name;
            projDicPath = GrpcGlobal.GenProjDic(fileName);
            if (string.IsNullOrEmpty(projDicPath))
            {
                errorMsg = "Create gen temp folder error,may u have already open it!";
                return(false);
            }

            // 组织这些文件成为一个project.xml文件
            csFiles     = new DirectoryInfo(resultDic).GetFiles("*.cs");
            projXml     = BuildGrpcProject.MakeProj(csFiles, csNamespace);
            projXmlPath = Path.Combine(projDicPath, csNamespace + ".csproj");
            Utility.WriteNewFile(projXmlPath, projXml);

            // 拷贝json文件
            GrpcGlobal.MoveProjectAsset(fileName);

            // 调用MSBuild生成这个项目
            msbuildPath = GrpcGlobal.MsBuildPath();
            if (string.IsNullOrEmpty(msbuildPath))
            {
                errorMsg = "VS2017安装目录中找不到MSBuild.exe,或者安装的VS2017目录没有2017标识,或者VS2017从未打开过, 请检查注册表 \r\n Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache";
                return(false);
            }

            // 调用restore
            Utility.RunCmd("dotnet", "restore", projDicPath, out errorMsg);


            // 为防止有的客户端路径中包含空格影响参数的设置
            // 设置运行的目录在客户端当前目录调用MSBuild
            Utility.RunProcess(msbuildPath, projDicPath, csNamespace + ".csproj");
            #endregion

            grpcDllPath = Path.Combine(projDicPath, @"bin\Debug\net46", csNamespace + ".dll");
            resultDic   = GenUtilityOrigin.ToResultDic(fileName, grpcDllPath, csNamespace, out errorMsg);
            if (!string.IsNullOrEmpty(errorMsg))
            {
                return(false);
            }
            return(true);
        }