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