From 1ab441dda3d894d37ce8479904a3a97fd7182c0a Mon Sep 17 00:00:00 2001 From: yhh <359807859@qq.com> Date: Mon, 30 Jul 2018 20:27:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLEditor/CLEditor.csproj | 5 +- CLEditor/CLGame/CLGame.csproj | 2 +- CLEditor/CodeGenerator/Generator.cs | 146 +++++++++++++ CLEditor/Core/EditorUtil.cs | 23 ++ CLEditor/Helper/ProjectHelper.cs | 124 ----------- CLEditor/ViewModel/MainViewModel.cs | 4 +- CLEditor/ViewModel/ProjectViewModel.cs | 290 ++++++++++++++++++++++--- CLPipleline/bin/Debug/CLPipleline.dll | Bin 5120 -> 5120 bytes CLPipleline/bin/Debug/CLPipleline.pdb | Bin 11776 -> 11776 bytes 9 files changed, 439 insertions(+), 155 deletions(-) create mode 100644 CLEditor/CodeGenerator/Generator.cs diff --git a/CLEditor/CLEditor.csproj b/CLEditor/CLEditor.csproj index 708f2aa..8d4dfbc 100644 --- a/CLEditor/CLEditor.csproj +++ b/CLEditor/CLEditor.csproj @@ -160,6 +160,7 @@ + @@ -531,7 +532,9 @@ - + + PreserveNewest + diff --git a/CLEditor/CLGame/CLGame.csproj b/CLEditor/CLGame/CLGame.csproj index c109e81..2f6560f 100644 --- a/CLEditor/CLGame/CLGame.csproj +++ b/CLEditor/CLGame/CLGame.csproj @@ -1,5 +1,5 @@  - + Debug diff --git a/CLEditor/CodeGenerator/Generator.cs b/CLEditor/CodeGenerator/Generator.cs new file mode 100644 index 0000000..7a78a45 --- /dev/null +++ b/CLEditor/CodeGenerator/Generator.cs @@ -0,0 +1,146 @@ +using System; +using System.CodeDom; +using System.CodeDom.Compiler; +using System.IO; +using System.Reflection; +using Microsoft.CSharp; + +namespace CLEditor.CodeGenerator +{ + public class Generator + { + public string FileName { get; set; } + public CodeCompileUnit CodeCompileUnit { get; set; } + public CodeNamespace CodeNamespace { get; set; } + + public Generator(string fileName) + { + FileName = fileName; + CodeCompileUnit = new CodeCompileUnit(); + } + + /// + /// 生成命名空间 + /// + /// + public void GeneratorNamespace(string name) + { + CodeNamespace = new CodeNamespace(name); + CodeCompileUnit.Namespaces.Add(CodeNamespace); + } + + /// + /// 生成引用 + /// + /// + public void GeneratorReference(string name) + { + CodeNamespace.Imports.Add(new CodeNamespaceImport(name)); + } + + /// + /// 生成类 + /// + /// + public CodeTypeDeclaration GeneratorClass(string name) + { + var codeTypeDeclaration = new CodeTypeDeclaration(name); + + return codeTypeDeclaration; + } + + /// + /// 生命继承关系 + /// 基类/接口 + /// + /// + /// + public void GeneratorBaseClass(CodeTypeDeclaration codeTypeDeclaration, CodeTypeReference baseType) + { + codeTypeDeclaration.BaseTypes.Add(baseType); + } + + /// + /// 生成Attribute + /// + /// + /// + public void GeneratorAttribute(CodeTypeDeclaration codeTypeDeclaration, string name) + { + codeTypeDeclaration.CustomAttributes.Add(new CodeAttributeDeclaration(name)); + } + + /// + /// 添加无参构造函数 + /// + public CodeConstructor GeneratorContructor() + { + var constructor = new CodeConstructor(); + + return constructor; + } + + /// + /// 添加方法 + /// + public CodeMemberMethod GeneratorMethod(string name) + { + var method = new CodeMemberMethod + { + Name = name, + }; + + return method; + } + + /// + /// 生成入口点方法 + /// + /// + public CodeEntryPointMethod GenerateEntryPointMethod() + { + var mainMethod = new CodeEntryPointMethod(); + + return mainMethod; + } + + /// + /// 生成字段 + /// + /// + /// + /// + public CodeMemberField GenerateMemberField(string type, string name) + { + var member = new CodeMemberField(type, name); + + return member; + } + + /// + /// 生成字段 + /// + /// + /// + /// + public CodeMemberField GenerateMemberField(Type type, string name) + { + var member = new CodeMemberField(type, name); + + return member; + + } + + /// + /// 保存为文件 + /// + public void Save() + { + var provider = new CSharpCodeProvider(); + var generator = provider.CreateGenerator(FileName); + var indentedTextWriter = new IndentedTextWriter(new StreamWriter(FileName, false)); + generator.GenerateCodeFromCompileUnit(CodeCompileUnit, indentedTextWriter, new CodeGeneratorOptions()); + indentedTextWriter.Close(); + } + } +} \ No newline at end of file diff --git a/CLEditor/Core/EditorUtil.cs b/CLEditor/Core/EditorUtil.cs index a9fff36..c2d22ba 100644 --- a/CLEditor/Core/EditorUtil.cs +++ b/CLEditor/Core/EditorUtil.cs @@ -39,11 +39,34 @@ namespace CLEditor.Core "x64/lua52.dll", }; + public static List NonRerenceList = new List + { + "libbulletc.dll", + "libbulletc-windows-x64.dll", + "libbulletc-windows-x86.dll", + "x86/lua52.dll", + "x64/lua52.dll", + "SharpDX.Direct2D1.dll", + "SharpDX.Direct3D9.dll", + "SharpDX.Direct3D11.dll", + "SharpDX.dll", + "SharpDX.DXGI.dll", + "SharpDX.MediaFoundation.dll", + "SharpDX.RawInput.dll", + "SharpDX.XAudio2.dll", + "SharpDX.XInput.dll", + }; + public static List ContentList = new List { "Content.mgcb", }; + public static List OtherContentList = new List + { + "logo64-64.ico", + }; + /// /// 复制文件夹下所有文件 diff --git a/CLEditor/Helper/ProjectHelper.cs b/CLEditor/Helper/ProjectHelper.cs index eda3df2..9ee4916 100644 --- a/CLEditor/Helper/ProjectHelper.cs +++ b/CLEditor/Helper/ProjectHelper.cs @@ -1,10 +1,5 @@ using System; using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Reflection; -using System.Text; using CLEditor.Properties; using Microsoft.Build.Evaluation; @@ -12,125 +7,6 @@ namespace CLEditor.Helper { public static class ProjectHelper { - public const string ManifestNamespace = "CLEditor.CLGame."; - - public static void SaveToProject(this Assembly assembly, string manifestName, string savePath, - string projectName) - { - if (!Directory.Exists(savePath)) - Directory.CreateDirectory(savePath); - - var result = ConvertToDirectoryName(manifestName.Replace(ManifestNamespace, string.Empty)); - - result = result.Replace("GeonBit//Core", "GeonBit.Core"); - result = result.Replace("GeonBit//UI", "GeonBit.UI"); - - result = result.Replace("SharpDX//", "SharpDX."); - result = result.Replace("MonoGame//", "MonoGame."); - - if (result.Contains("CLGame.csproj")) - result = result.Replace("CLGame", projectName); - - var resultPath = Path.Combine(savePath, result); - if (!Directory.Exists(Path.GetDirectoryName(resultPath))) - { - var isExist = Path.GetDirectoryName(resultPath); - if (string.IsNullOrEmpty(isExist)) - { - throw new InvalidOperationException(); - } - Directory.CreateDirectory(isExist); - } - - if (File.Exists(resultPath)) - File.Delete(resultPath); - - using (var stream = new FileStream(resultPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) - { - BeginWrite(assembly, manifestName, stream); - } - } - - private static void BeginWrite(Assembly assembly, string manifestName, FileStream stream) - { - using (var streamWriter = new StreamWriter(stream, Encoding.UTF8)) - { - GetManifestResource(assembly, manifestName, stream, streamWriter); - } - - stream.Close(); - } - - private static void GetManifestResource(Assembly assembly, string manifestName, FileStream stream, StreamWriter streamWriter) - { - using (var manifestStream = assembly.GetManifestResourceStream(manifestName)) - { - BeginRead(stream, streamWriter, manifestStream); - } - - streamWriter.Close(); - } - - private static void BeginRead(FileStream stream, StreamWriter streamWriter, Stream manifestStream) - { - if (manifestStream != null) - { - using (var streamReader = new StreamReader(manifestStream, Encoding.UTF8)) - { - TryToImageFile(stream, streamWriter, manifestStream, streamReader); - } - } - - if (manifestStream != null) - { - manifestStream.Close(); - } - } - - private static void TryToImageFile(FileStream stream, StreamWriter streamWriter, Stream manifestStream, StreamReader streamReader) - { - try - { - var image = Image.FromStream(manifestStream); - image.Save(stream, ImageFormat.Png); - } - catch - { - var content = streamReader.ReadToEnd(); - - streamWriter.Write(content); - streamWriter.Close(); - } - } - - private static string ConvertToDirectoryName(string name) - { - var splitName = name.Split('.'); - var resultName = string.Empty; - if (splitName.Length > 2) - { - for (var i = 0; i < splitName.Length; i++) - { - if (i == splitName.Length - 2) - { - resultName += string.Concat(splitName[i], "."); - } - else if (i == splitName.Length - 1) - { - resultName += splitName[i]; - } - else - { - resultName += string.Concat(splitName[i], "//"); - } - } - - return resultName; - } - - return name; - } - public static void RunCodeEditor(string argument) { if (string.IsNullOrEmpty(Settings.Default.vscode)) diff --git a/CLEditor/ViewModel/MainViewModel.cs b/CLEditor/ViewModel/MainViewModel.cs index e422478..0492d59 100644 --- a/CLEditor/ViewModel/MainViewModel.cs +++ b/CLEditor/ViewModel/MainViewModel.cs @@ -152,8 +152,6 @@ namespace CLEditor.ViewModel viewModel.BuildComplete = false; } - CopyEditorContent(); - var editorLoad = new EditorLoad(); editorLoad.Show(); @@ -218,7 +216,7 @@ namespace CLEditor.ViewModel if (Directory.Exists(srcDirectory)) { Directory.CreateDirectory(destDirectory); - EditorUtil.CopyDirectory(srcDirectory, destDirectory); + CopyEditorContent(); CopyCoreFile(Path.Combine(Environment.CurrentDirectory, "CLEditor.Core.dll"), Path.Combine(Project.DirectoryPath, outputPath, "CLEditor.Core.dll")); } diff --git a/CLEditor/ViewModel/ProjectViewModel.cs b/CLEditor/ViewModel/ProjectViewModel.cs index 69435fa..92188b1 100644 --- a/CLEditor/ViewModel/ProjectViewModel.cs +++ b/CLEditor/ViewModel/ProjectViewModel.cs @@ -1,18 +1,23 @@ using System; +using System.CodeDom; using System.IO; using System.Reflection; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; using System.Windows.Input; +using CLEditor.CodeGenerator; using CLEditor.Core; -using CLEditor.Helper; using CommonServiceLocator; using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.CommandWpf; +using GeonBit; using Microsoft.Build.Construction; using Microsoft.Build.Evaluation; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; using Debug = System.Diagnostics.Debug; +// ReSharper disable BitwiseOperatorOnEnumWithoutFlags namespace CLEditor.ViewModel { @@ -73,33 +78,70 @@ namespace CLEditor.ViewModel var model = ServiceLocator.Current.GetInstance(); - var assembly = Assembly.GetExecutingAssembly(); - var allManifestResourceNames = assembly.GetManifestResourceNames(); - foreach (var allManifestResourceName in allManifestResourceNames) + var projectFile = Path.Combine(ProjectPath, string.Concat(ProjectName, ".cl")); + var project = new Project(); + if (!File.Exists(projectFile)) { - if (!allManifestResourceName.Contains(ProjectHelper.ManifestNamespace)) - continue; - - assembly.SaveToProject(allManifestResourceName, ProjectPath, ProjectName); + project.Save(projectFile); } - - CopyMgcbContent(); + + project.FullPath = projectFile; + + project.SetProperty("RootNamespace", ProjectName); + project.SetProperty("ProjectGuid", Guid.NewGuid().ToString()); + project.SetProperty("OutputType", "WinExe"); + project.SetProperty("AssemblyName", ProjectName); + project.SetProperty("TargetFrameworkVersion", "v4.5"); + project.SetProperty("MonoGamePlatform", "DesktopGL"); + project.SetProperty("ProjectTypeGuids", Guid.NewGuid().ToString()); + project.SetProperty("WarningLevel", "4"); + var debugConfig = project.SetProperty("Configuration", "Debug"); + debugConfig.Xml.Condition = "'$(Configuration)' == ''"; + var platformProperty = project.SetProperty("Platform", "AnyCPU"); + platformProperty.Xml.Condition = "'$(Platform)' == ''"; + + project.AddItem("Reference", "System"); + project.AddItem("Reference", "System.Xml"); + + CopyMgcbContent(ref project); CopyDefaultContent(); - CopyReference(); + CopyOtherContent(ref project); + CopyReference(ref project); ChangeMgcbResource(); - - if (!File.Exists(Path.Combine(ProjectPath, string.Concat(ProjectName, ".csproj")))) - return; + GenerateMainCode(ref project); + + model.Project = project; // 初始化工程 var projectElement = - ProjectRootElement.Open(Path.Combine(ProjectPath, string.Concat(ProjectName, ".csproj"))); + ProjectRootElement.Open(projectFile); if (model.Project == null) model.Project = new Project(projectElement); - model.Project.SetProperty("ProjectGuid", Guid.NewGuid().ToString()); - model.Project.SetProperty("RootNamespace", ProjectName); - model.Project.Save(); + if (projectElement != null) + { + projectElement.AddImport("$(MSBuildToolsPath)\\Microsoft.CSharp.targets"); + projectElement.AddImport("$(MSBuildExtensionsPath)\\MonoGame\\v3.0\\MonoGame.Content.Builder.targets"); + var element = projectElement.AddImport("$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props"); + element.Condition = "Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')"; + + var platGroup = projectElement.AddPropertyGroup(); + platGroup.Condition = "'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'"; + + platGroup.AddProperty("PlatformTarget", "AnyCPU"); + platGroup.AddProperty("DebugSymbols", "true"); + platGroup.AddProperty("DebugType", "full"); + platGroup.AddProperty("Optimize", "false"); + platGroup.AddProperty("OutputPath", "Build\\"); + platGroup.AddProperty("DefineConstants", "DEBUG;TRACE"); + platGroup.AddProperty("ErrorReport", "prompt"); + platGroup.AddProperty("WarningLevel", "4"); + + var iconGroup = projectElement.AddPropertyGroup(); + iconGroup.AddProperty("ApplicationIcon", "logo64-64.ico"); + } + + model.Project.Save(projectFile); ServiceLocator.Current.GetInstance().SetTaskProgress(EditorTaskStatus.Complete); } @@ -113,7 +155,161 @@ namespace CLEditor.ViewModel } } - private void CopyMgcbContent() + private void CopyOtherContent(ref Project project) + { + foreach (var otherContent in EditorUtil.OtherContentList) + { + var preContent = Path.Combine(Application.StartupPath, otherContent); + + if (ProjectPath == null) + { + return; + } + + Directory.CreateDirectory(ProjectPath); + + ServiceLocator.Current.GetInstance().TaskProgress = otherContent; + + var workContent = otherContent; + var targetContent = Path.Combine(ProjectPath, workContent); + var directoryName = Path.GetDirectoryName(targetContent); + AddItem(ref project, "None", targetContent); + + ThreadPool.QueueUserWorkItem(state => + { + if (!string.IsNullOrEmpty(directoryName)) + { + Directory.CreateDirectory(directoryName); + } + + File.Copy(preContent, targetContent, true); + }); + } + } + + private void GenerateMainCode(ref Project project) + { + GenerateProgramCode(ref project); + GenerateGameCode(ref project); + } + + private void GenerateGameCode(ref Project project) + { + var targetFile = Path.Combine(project.DirectoryPath, "Game1.cs"); + var nameSpace = project.GetPropertyValue("RootNamespace"); + var generate = new Generator(targetFile); + generate.GeneratorNamespace(nameSpace); + + generate.GeneratorReference("System"); + generate.GeneratorReference("System.IO"); + generate.GeneratorReference("System.Reflection"); + generate.GeneratorReference("GeonBit"); + generate.GeneratorReference("GeonBit.UI"); + generate.GeneratorReference("Microsoft.Xna.Framework"); + generate.GeneratorReference("Microsoft.Xna.Framework.Graphics"); + generate.GeneratorReference("NLua"); + + var cla = generate.GeneratorClass("Game1"); + cla.BaseTypes.Add(typeof(GeonBitGame)); + cla.Comments.Add(new CodeCommentStatement("这是游戏主入口点")); + generate.CodeNamespace.Types.Add(cla); + + var graphicsMember = generate.GenerateMemberField(typeof(GraphicsDeviceManager), "graphics"); + cla.Members.Add(graphicsMember); + + var spriteBatchMember = generate.GenerateMemberField(typeof(SpriteBatch), "spriteBatch"); + cla.Members.Add(spriteBatchMember); + + var scriptMember = generate.GenerateMemberField("Lua", "Script"); + scriptMember.Attributes = MemberAttributes.Family; + cla.Members.Add(scriptMember); + + var assemblyMember = generate.GenerateMemberField(typeof(Assembly), "CurrentAssembly"); + assemblyMember.InitExpression = new CodeSnippetExpression("Assembly.GetExecutingAssembly()"); + cla.Members.Add(assemblyMember); + + var constructor = generate.GeneratorContructor(); + constructor.Attributes = MemberAttributes.Public; + constructor.Statements.Add(new CodeSnippetStatement("InitParams.UiTheme = \"editor\";")); + constructor.Statements.Add(new CodeSnippetStatement("InitParams.DebugMode = true;")); + constructor.Statements.Add(new CodeSnippetStatement("InitParams.EnableVsync = true;")); + constructor.Statements.Add(new CodeSnippetStatement("Script = new Lua();")); + constructor.Statements.Add(new CodeSnippetStatement("Script.LoadCLRPackage();")); + constructor.Statements.Add(new CodeSnippetStatement("ImportAssembly(\"CLEditor.Core\", \"CLEditor.Core\");")); + constructor.Statements.Add(new CodeSnippetStatement("ImportAssembly(\"CLGame\", \"CLGame\");")); + constructor.Statements.Add(new CodeSnippetStatement("ImportAssembly(\"CLGame\", \"CLGame.Components\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"MonoGame.Framework\", \"MonoGame.Framework\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"MonoGame.Framework\", \"Microsoft.Xna.Framework.Audio\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"MonoGame.Framework\", \"Microsoft.Xna.Framework.Graphics\");")); + constructor.Statements.Add(new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit\");")); + constructor.Statements.Add(new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit.Core\");")); + constructor.Statements.Add(new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit.ECS\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit.ECS.Components\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit.ECS.Components.Graphics\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit.ECS.Components.Misc\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit.ECS.Components.Particles\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit.ECS.Components.Physics\");")); + constructor.Statements.Add( + new CodeSnippetStatement("ImportAssembly(\"GeonBit\", \"GeonBit.ECS.Components.Sound\");")); + constructor.Statements.Add(new CodeSnippetStatement("ImportAssembly(\"GeonBit.UI\", \"GeonBit.UI\");")); + constructor.Statements.Add(new CodeSnippetStatement("ImportAssembly(\"GeonBit.UI\", \"GeonBit.UI.Entities\");")); + constructor.Statements.Add(new CodeSnippetStatement("Script[\"Resources\"] = Resources;")); + cla.Members.Add(constructor); + + var initMethod = generate.GeneratorMethod("Initialize"); + initMethod.Attributes = MemberAttributes.Override | MemberAttributes.Public; + initMethod.Statements.Add(new CodeSnippetStatement("Script.DoFile(\"Scripts / core.lua\");")); + cla.Members.Add(initMethod); + + var importAssemblyMethod = generate.GeneratorMethod("ImportAssembly"); + importAssemblyMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "assembly")); + importAssemblyMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "nameSpace")); + importAssemblyMethod.Statements.Add(new CodeSnippetStatement("var script = string.Format(\"import('{0}', '{1}')\", assembly, nameSpace);")); + importAssemblyMethod.Statements.Add(new CodeSnippetStatement("Script.DoString(script);")); + cla.Members.Add(importAssemblyMethod); + + generate.Save(); + + AddItem(ref project, "Compile", targetFile); + } + + private void GenerateProgramCode(ref Project project) + { + var targetFile = Path.Combine(project.DirectoryPath, "Program.cs"); + var nameSpace = project.GetPropertyValue("RootNamespace"); + // 初始化生成器 + var generate = new Generator(targetFile); + // 初始化命名空间 + generate.GeneratorNamespace(nameSpace); + // 初始化引用 + generate.GeneratorReference("System"); + generate.GeneratorReference("GeonBit"); + // 初始化主类 + var cla = generate.GeneratorClass("Program"); + cla.Attributes = MemberAttributes.Static | MemberAttributes.Public; + generate.CodeNamespace.Types.Add(cla); + + // 初始化方法 + var method = generate.GenerateEntryPointMethod(); + method.Attributes = MemberAttributes.Static; + method.Statements.Add(new CodeSnippetStatement("GeonBitMain.Instance.Run(new Game1());")); + method.CustomAttributes.Add(new CodeAttributeDeclaration("STAThread")); + cla.Members.Add(method); + // 保存文件 + generate.Save(); + + AddItem(ref project, "Compile", targetFile); + } + + private void CopyMgcbContent(ref Project project) { foreach (var content in EditorUtil.ContentList) { @@ -129,11 +325,12 @@ namespace CLEditor.ViewModel ServiceLocator.Current.GetInstance().TaskProgress = content; var workContent = content; + var targetContent = Path.Combine(ProjectPath, "Content", workContent); + var directoryName = Path.GetDirectoryName(targetContent); + AddItem(ref project, "MonoGameContentReference", targetContent); + ThreadPool.QueueUserWorkItem(state => { - var targetContent = Path.Combine(ProjectPath, "Content", workContent); - var directoryName = Path.GetDirectoryName(targetContent); - if (!string.IsNullOrEmpty(directoryName)) { Directory.CreateDirectory(directoryName); @@ -144,6 +341,29 @@ namespace CLEditor.ViewModel } } + private void AddItem(ref Project project, string itemType, string fileName) + { + if (itemType.Equals("Reference")) + { + var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); + if (!string.IsNullOrEmpty(fileNameWithoutExtension)) + { + var items = project.AddItem(itemType, fileNameWithoutExtension); + foreach (var projectItem in items) + { + if (projectItem.UnevaluatedInclude.Equals(fileNameWithoutExtension)) + { + projectItem.SetMetadataValue("HintPath", fileName.Replace(project.DirectoryPath, "").TrimStart('\\')); + break; + } + } + } + return; + } + + project.AddItem(itemType, fileName.Replace(project.DirectoryPath, "").TrimStart('\\')); + } + private void CopyDefaultContent() { var sourceContent = Path.Combine(Application.StartupPath, "Content"); @@ -158,7 +378,6 @@ namespace CLEditor.ViewModel ServiceLocator.Current.GetInstance().TaskProgress = "复制资源文件"; ThreadPool.QueueUserWorkItem(state => EditorUtil.CopyDirectory(sourceContent, ProjectPath)); - } private async void ChangeMgcbResource() @@ -204,7 +423,7 @@ namespace CLEditor.ViewModel } - private void CopyReference() + private void CopyReference(ref Project project) { foreach (var reference in EditorUtil.ReferenceList) @@ -221,11 +440,30 @@ namespace CLEditor.ViewModel ServiceLocator.Current.GetInstance().TaskProgress = reference; var workReference = reference; + var targetContent = Path.Combine(ProjectPath, workReference); + var directoryName = Path.GetDirectoryName(targetContent); + + if (Path.GetExtension(targetContent).ToLower().Equals(".dll")) + { + var isInclude = false; + foreach (var nonReference in EditorUtil.NonRerenceList) + { + if (targetContent.Contains(nonReference)) + { + isInclude = true; + break; + } + } + + if (isInclude == false) + { + AddItem(ref project, "Reference", targetContent); + } + } + ThreadPool.QueueUserWorkItem(state => { - var targetContent = Path.Combine(ProjectPath, workReference); - var directoryName = Path.GetDirectoryName(targetContent); if (!string.IsNullOrEmpty(directoryName)) { Directory.CreateDirectory(directoryName); diff --git a/CLPipleline/bin/Debug/CLPipleline.dll b/CLPipleline/bin/Debug/CLPipleline.dll index e51151708e05814ac3899ec7edbbf41817af221c..d7532c8f8e5e5f70da55b6d5192f7879a35c481b 100644 GIT binary patch delta 66 zcmZqBXwaC@!L0BzZezD2r@&S! delta 66 zcmZqBXwaC@!91@qbYr(8r$BhY>@~7a_Bd?(8I-%E?9%4VcQ^wWL9&zexg`Ze`0kaI V+lf0)Ik2?IZOdez%@N!yH~^|{8)^Um diff --git a/CLPipleline/bin/Debug/CLPipleline.pdb b/CLPipleline/bin/Debug/CLPipleline.pdb index 945a0f9b7c50f720b29fe17c26388bf9a892ef8e..ff42f2a19a92c13aabc656cd8c41a6de1093d55f 100644 GIT binary patch delta 79 zcmZpOX^7dt!X=^bGcKBufq`M_rp+5phX=ZEi&(W!NUX$cvkcc8ZnlfpoW*{rZ{`#G L#*as(+7osFt!*Ay delta 79 zcmZpOX^7dt!X+`UF*KTyfq_AU?_No{ow(za151nCwoLZfEW`DNn~md8z=Tkx&3t0t L`0=Pzd%_L?DMTBD -- Gitee