#眉標=.NET #副標=訂制你的IDE #大標=ASP.NET元件產生器(2) #作者=文/黃忠成 -----程式1----- using System; using System.Text; using System.CodeDom; using System.CodeDom.Compiler; namespace ASPNetCompGeneratorLibrary{ public class CoreGenerator{ private CodeDomProvider _provider; public CodeDomProvider CodeProvider { get { return _provider; } } public CoreGenerator(CodeDomProvider provider) { _provider = provider; } public StringBuilder Execute(System.Windows.Forms.IWin32Window owner) { using(mainForm form = new mainForm(this)) { form.ShowDialog(owner); if(form.DialogResult == System.Windows.Forms.DialogResult.OK) return form.GenerateCode; else return null; } } } }-----end----- -----程式2----- using System; using System.Text; using System.CodeDom.Compiler; using System.Runtime.InteropServices; using EnvDTE; using ASPNetCompGeneratorLibrary; using Microsoft.CSharp; using Microsoft.VisualBasic; namespace ASPCompGeneratorWizard { [GuidAttribute("4EB6605C-8134-41B3-BE28-58D92D9DB8ED"), ProgId("ASPCompGeneratorWiz")] public class Wizard : EnvDTE.IDTWizard { private EnvDTE.DTE _applicationObject; public void Execute(object Application, int hwndOwner, ref object[] ContextParams, ref object[] CustomParams, ref EnvDTE.wizardResult retval) { _applicationObject = (EnvDTE.DTE)Application; string wizardType = (string)ContextParams[0]; string projectName = (string)ContextParams[1]; EnvDTE.ProjectItems projectItems = (EnvDTE.ProjectItems)ContextParams[2]; string newItemLocation = (string)ContextParams[3]; string newItemName = (string)ContextParams[4]; string productInstallDirectory = (string)ContextParams[5]; bool runSilent = (bool)ContextParams[6]; CodeDomProvider provider; if(newItemName.EndsWith(".cs")) provider = new CSharpCodeProvider(); else if(newItemName.EndsWith(".vb")) provider = new VBCodeProvider(); else throw new Exception("language not supported."); CoreGenerator generator = new CoreGenerator(provider); StringBuilder sb = generator.Execute(null); if(sb != null) { ProjectItem projectItem = _applicationObject.ItemOperations.AddNewItem("Code\\Code File",                         newItemName); ((TextDocument)_applicationObject.ActiveDocument.Object(              "TextDocument")).StartPoint.CreateEditPoint().Insert(sb.ToString()); } } } }-----end----- -----指令----- C:\tlbexp ASPCompGeneratorLibrary.dll -----end----- 然後必須使用regasm來註冊這個Assembly。 -----指令----- C:\regasm /codebase ASPCompGenreatorWizard.dll -----end----- 這兩個命令皆需於Visual Studio.NET Command Prompt環境下執行,在編譯專案後,你還得至Visual Studio.NET目錄下的VC#/CSharpProjectItems加入CSharpAspCompGenerator.vsz這個檔案,其內容如下。 -----指令----- VSWizard 7.0 Wizard=ASPCompGeneratorWiz -----end----- 最後在VC#/CSharpProjectItems/LocalProjectItems/LocalProjectItems.vsdir中加入下面的字串就完成了將Wizard安裝至Visual Studio.NET的工作。 -----指令----- ..\CSharpAspCompGenerator.vsz|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|ASP.NET Component Generator|22|ASP.NET Component Generator|{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}|4516|0|Component.cs -----end----- -----程式4----- namespace BDSASPCompGeneratorWizard { public abstract class BDSAspCompGeneratorWizard:IOTAFormWizard,IOTARepositoryWizard,IOTAWizard { public static int _wizardID = -1; protected abstract CodeDomProvider CodeProvider { get; } protected abstract string FileExtension { get; } public IOTAGalleryCategory GalleryCategory { //此處需傳回一個GalleryCategory物件,告知IDE將此Wizard顯示於那個Category內。 get { return OTAHelper.GalleryCategory; } } #region IOTARepositoryWizard public string Author { get { return "code6421"; } //作者 } public string Comment { get { return "Generate ASP.NET Component"; } //備註 } //此處告知IDE以那個ICON代表此Wizard public IntPtr Glyph { get { //embed resource name will be default namespace. Icon icon = new Icon(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(            "BDSASPCompGeneratorWizard.Wizard.ico")); return icon.Handle; } } public string Designer //此Wizard用於那一種Designer。 { get { return OTADesignerTypes.dDotNet; } } public virtual string Personality //支援那一種IDE。 { get { return OTAIDEPersonalities.sCSharpPersonality; } } #endregion #region IOTAWizard public string IDString { get { return "ASPCompGenerator"; } } public string Name //名稱 { get { return "ASPCompGenerator"; } } private void InternalExecute(string source) { IOTAModule module = null; IOTAModuleServices moduleServices = (IOTAModuleServices)BorlandIDE.GetService(typeof(IOTAModuleServices)); if (moduleServices.MainProjectGroup == null) MessageBox.Show("Please open or create a project before generate component."); else if (moduleServices.MainProjectGroup.ActiveProject != null) { IOTAModule module1; module = moduleServices.MainProjectGroup.ActiveProject; module1 = moduleServices.CreateModule( new BDSASPCompGeneratorModuleCreator(module,source,FileExtension)); } } public void Execute() { CoreGenerator generator = new CoreGenerator(CodeProvider); StringBuilder sb = generator.Execute(null); if(sb != null) InternalExecute(sb.ToString()); } public void Destroyed() { if (_wizardID > -1) { try {    (IOTAWizardService)BorlandIDE.GetService(       typeof(IOTAWizardService))).RemoveWizard(_wizardID); _wizardID = -1; } catch(Exception e){} } } #endregion } }-----end----- -----程式5----- using System; using System.CodeDom; using System.CodeDom.Compiler; using Microsoft.CSharp; using Borland.Studio.ToolsAPI; namespace BDSASPCompGeneratorWizard.CSharp { public class AspGeneratorWizard:BDSAspCompGeneratorWizard { private CodeDomProvider _provider; protected override CodeDomProvider CodeProvider { get { if(_provider == null) _provider = new CSharpCodeProvider(); return _provider; } } protected override string FileExtension { get { return ".cs"; } } public override string Personality { get { return OTAIDEPersonalities.sCSharpPersonality; } } #region IDE Register Function //wizard assembly must provide a static IDERegister method, //IDE will call it. public static void IDERegister() {    BDSAspCompGeneratorWizard._wizardID = ((IOTAWizardService)BorlandIDE.GetService(         typeof(IOTAWizardService))).AddWizard(new AspGeneratorWizard()); } #endregion } }-----end----- -----程式6----- using System; using System.CodeDom; using System.CodeDom.Compiler; using Borland.Delphi; using Borland.Studio.ToolsAPI; namespace BDSASPCompGeneratorWizard.CSharp { public class AspGeneratorWizard:BDSAspCompGeneratorWizard { private CodeDomProvider _provider; protected override CodeDomProvider CodeProvider { get { if(_provider == null) _provider = new DelphiCodeProvider(); return _provider; } } protected override string FileExtension { get { return ".pas";} } public override string Personality { get { return OTAIDEPersonalities.sDelphiDotNetPersonality; } } #region IDE Register Function //wizard assembly must provide a static IDERegister method, //IDE will call it. public static void IDERegister() { BDSAspCompGeneratorWizard._wizardID = ((IOTAWizardService)BorlandIDE.GetService( typeof(IOTAWizardService))).AddWizard(new AspGeneratorWizard()); } #endregion } }===========================