⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codedomgenerator.cs

📁 全功能c#编译器
💻 CS
字号:
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="Mike Kr黦er" email="mike@icsharpcode.net"/>
//     <version value="$version"/>
// </file>

using System;
using System.IO;
using System.Xml;
using System.Collections;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Text;
using System.Text.RegularExpressions;

using System.CodeDom;
using System.CodeDom.Compiler;

using Microsoft.CSharp;
using Microsoft.VisualBasic;
using ICSharpCode.SharpDevelop.Services;
using ICSharpCode.SharpDevelop.FormDesigner.Services;


namespace ICSharpCode.SharpDevelop.FormDesigner
{
	/// <summary>
	/// This class is able to generate a CodeDOM definition out of a XML file.
	/// </summary>
	public class CodeDOMGenerator
	{
		IDesignerHost   host;
		AmbienceService ambienceService = (AmbienceService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(AmbienceService));
		
		ICodeGenerator      codeGenerator;
		CodeTypeDeclaration codeTypeDeclaration;
		
		CodeNamespace           codeNamespace;
		CodeDOMGeneratorUtility codeDOMGeneratorUtility = new CodeDOMGeneratorUtility();
		
		public CodeDOMGenerator(IDesignerHost host, CodeDomProvider codeProvider)
		{
			this.host = host;
			codeGenerator = codeProvider.CreateGenerator();
			
			codeNamespace = new CodeNamespace("GeneratedForm");
			
			this.codeDOMGeneratorUtility.AddNamespaceImport("System");
			this.codeDOMGeneratorUtility.AddNamespaceImport("System.Windows.Forms");
			
			codeNamespace.Comments.Add(new CodeCommentStatement("This file was autogenerated by a tool.", false));
		}
		
		public void ConvertContentDefinition(string fileName)
		{
			StreamWriter sw = File.CreateText(fileName);
			ConvertContentDefinition(sw);
			sw.Close();
		}
		
		public void ConvertContentDefinition(TextWriter writer)
		{
			try {
				// create class
				CodeDomDesignerSerializetionManager serializationManager = (CodeDomDesignerSerializetionManager)host.GetService(typeof(IDesignerSerializationManager));
				serializationManager.Initialize();
				DesignerResourceService designerResourceService = (DesignerResourceService)serializationManager.GetService(typeof(System.ComponentModel.Design.IResourceService));
				designerResourceService.SerializationStarted(true);
				
				foreach (IComponent c in host.Container.Components)  {
					serializationManager.SetName(c, c.Site.Name);
				}
				CodeDomSerializer rootSerializer = serializationManager.GetRootSerializer(host.RootComponent.GetType());
				
				if (rootSerializer == null) {
					throw new Exception("No root serializer found");
				}
				//Serialize host to CodeDom
				codeTypeDeclaration = (CodeTypeDeclaration)rootSerializer.Serialize(serializationManager, host.RootComponent);
				// triger serializationManager.SerializationCompleted
				serializationManager.OnSerializationComplete();
				designerResourceService.SerializationEnded(true);
				
				// create constructor
				CodeConstructor cc = new CodeConstructor();
				cc.Attributes =  MemberAttributes.Public | MemberAttributes.Final;
				if (ambienceService.GenerateAdditionalComments) {
					cc.Statements.Add(new CodeCommentStatement(" Must be called for initialization", false));
				}
				cc.Statements.Add(new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "InitializeComponent")));
				if (ambienceService.GenerateAdditionalComments) {
					cc.Statements.Add(new CodeCommentStatement("", false));
					cc.Statements.Add(new CodeCommentStatement(" TODO : Add constructor code after InitializeComponents", false));
					cc.Statements.Add(new CodeCommentStatement("", false));
				}
				foreach (object o in codeTypeDeclaration.Members) {
					if (o is CodeMemberMethod) {
						CodeMemberMethod method = (CodeMemberMethod)o;
					
//					foreach (object st in method.Statements) {
//						if (st is CodeAssignStatement) {
//							CodeAssignStatement cas = (CodeAssignStatement)st;
//							CodeExpression ce = cas.Right;
//							Console.WriteLine("right : " + ce);
//							while (ce is CodeFieldReferenceExpression) {
//								CodeFieldReferenceExpression fre = (CodeFieldReferenceExpression)ce;
//								Console.WriteLine("FieldName : " + fre.FieldName);
//								ce = fre.TargetObject;
//								Console.WriteLine("Target: " + ce);
//								if (ce is CodeTypeReferenceExpression) {
//									Console.WriteLine("Type: " + ((CodeTypeReferenceExpression)ce).Type.BaseType );
//								}
//							}
//							if (ce is CodePropertyReferenceExpression) {
//								CodePropertyReferenceExpression cpre = (CodePropertyReferenceExpression)ce;
//								Console.WriteLine("Propertyname:");
//								Console.WriteLine(cpre.PropertyName);
//								Console.WriteLine("target object:");
//								Console.WriteLine(cpre.TargetObject);
//							}
//						}
//						Console.WriteLine(st);
//					} 
					
//					int i = 0;
//					for (; i < method.Statements.Count; ++i) {
//						if (method.Statements[i] is System.CodeDom.CodeCommentStatement) {
//							break;
//						}
//					}
//					
//					foreach (IComponent component in host.Container.Components) {
//						if (component != host.RootComponent && component is Control && ((Control)component).Controls != null && ((Control)component).Controls.Count > 0) {
//							CodeFieldReferenceExpression fieldRef = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), component.Site.Name);
//							method.Statements.Insert(i, new CodeExpressionStatement(new CodeMethodInvokeExpression(fieldRef, "SuspendLayout")));
//							method.Statements.Add(new CodeMethodInvokeExpression(fieldRef, "ResumeLayout", new CodePrimitiveExpression(false)));
//						}
//					}
//					
//					if (host.RootComponent is Control) {
//						
//						method.Statements.Insert(i, new CodeExpressionStatement(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "SuspendLayout")));
//						method.Statements.Add(new CodeMethodInvokeExpression(new CodeThisReferenceExpression(), "ResumeLayout", new CodePrimitiveExpression(false)));
//					}
						break;
					}
				}
				
				codeTypeDeclaration.Members.Add(cc);
				
				// finally generate code
				codeNamespace.Types.Add(codeTypeDeclaration);
				codeNamespace.Imports.Add(new CodeNamespaceImport("System"));
				codeNamespace.Imports.Add(new CodeNamespaceImport("System.Drawing"));
				codeNamespace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
				
				codeGenerator.GenerateCodeFromNamespace(codeNamespace, writer, codeDOMGeneratorUtility.CreateCodeGeneratorOptions);
				
//				{
//					// Output code
//					TextWriter writer2 = new StringWriter();
//					codeGenerator.GenerateCodeFromNamespace(codeNamespace, writer2, null);
//					Console.WriteLine(writer2.ToString());
//				}
			} catch (Exception e) {
				Console.WriteLine("Exception : " + e.ToString());
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -