代码之家  ›  专栏  ›  技术社区  ›  Charlie

如何从继承自Microsoft.VisualStudio.TextTemplating.vshost.BaseCodeGeneratorWithSite的类访问CodeDomProvider?

  •  0
  • Charlie  · 技术社区  · 14 年前

    有人知道如何得到 代码提供者 在新的Microsoft.VisualStudio.TextTemplating.vsHost中。 带站点的基本代码生成器 从Visual Studio 2010 SDK?我以前只通过继承类microsoft.customtool.basecodeGeneratorWithSite就可以访问它,但现在有了这个新类,它就不存在了。我看到一个GlobalsServiceProvider和一个SiteServiceProvider,但是我找不到任何关于如何使用它们的示例。

    Microsoft.VisualStudio.TextTemplating.vshost.BasecodeGeneratorWithSite: http://msdn.microsoft.com/en-us/library/bb932625.aspx

    我要这么做:

    public class Generator : Microsoft.VisualStudio.TextTemplating.VSHost.BaseCodeGeneratorWithSite {
    
        public override string GetDefaultExtension() {
            // GetDefaultExtension IS ALSO NOT ACCESSIBLE...
            return this.InputFilePath.Substring(this.InputFilePath.LastIndexOf(".")) + ".designer" + base.GetDefaultExtension();
        }
    
        // This method is being called every time the attached xml is saved.
        protected override byte[] GenerateCode(string inputFileName, string inputFileContent) {
            try {
                // Try to generate the wrapper file.
                return GenerateSourceCode(inputFileName);
            } catch (Exception ex) {
                // In case of a faliure - print the exception 
                // as a comment in the source code.
                return GenerateExceptionCode(ex);
            }
        }
    
        public byte[] GenerateSourceCode(string inputFileName) {
            Dictionary<string, CodeCompileUnit> oCodeUnits;
    
            // THIS IS WHERE CodeProvider IS NOT ACCESSIBLE
            CodeDomProvider oCodeDomProvider = this.CodeProvider;
    
            string[] aCode = new MyCustomAPI.GenerateCode(inputFileName, ref oCodeDomProvider);
            return Encoding.ASCII.GetBytes(String.Join(@"
    ", aCode));
        }
    
        private byte[] GenerateExceptionCode(Exception ex) {
            CodeCompileUnit oCode = new CodeCompileUnit();
    
            CodeNamespace oNamespace = new CodeNamespace("System");
            oNamespace.Comments.Add(new CodeCommentStatement(MyCustomAPI.Print(ex)));
            oCode.Namespaces.Add(oNamespace);
            string sCode = null;
            using (StringWriter oSW = new StringWriter()) {
                using (IndentedTextWriter oITW = new IndentedTextWriter(oSW)) {
                    this.CodeProvider.GenerateCodeFromCompileUnit(oCode, oITW, null);
                    sCode = oSW.ToString();
                }
            }
            return Encoding.ASCII.GetBytes(sCode );
        }
    }
    

    谢谢你的帮助!

    1 回复  |  直到 13 年前
        1
  •  1
  •   GarethJ    14 年前

    您可以通过SiteServiceProvider请求SVSMDCODEDOProvider服务来访问codedomProvider。

    沿着这条线的东西:

    IVSMDCodeDomProvider provider = SiteServiceProvider. 
            GetService(typeof(SVSMDCodeDomProvider)) as IVSMDCodeDomProvider;
    
    if (provider != null)
    {
        codeDomProvider = provider.CodeDomProvider as CodeDomProvider;
    }
    

    SiteServiceProvider是SingleFileGenerator站点公开的有限范围服务提供程序,而GlobalServiceProvider是VS的主服务提供程序,您可以请求任何全局范围的接口。

    希望这有帮助。 加里斯