2010-07-23 3 views
0

누구든지 CodeDomProvider을 새로운 Microsoft.VisualStudio.TextTemplating.VSHost에 가져 오는 방법을 알고 있습니까? Visual Studio 2010 SDK의 BaseCodeGeneratorWithSite? 이전에는 클래스 Microsoft.CustomTool.BaseCodeGeneratorWithSite의 단순한 상속만으로도 액세스 할 수 있었지만 지금은이 새로운 클래스를 사용하여 액세스 할 수 없습니다. GlobalServiceProvider 및 SiteServiceProvider가 표시되지만이를 사용하는 방법에 대한 예제는 찾을 수 없습니다.Microsoft.VisualStudio.TextTemplating.VSHost.BaseCodeGeneratorWithSite에서 상속받은 클래스에서 CodeDomProvider에 액세스하려면 어떻게합니까?

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

SVSMDCodeDomProvider 서비스를 요청하여 SiteServiceProvider를 통해 CodeDomProvider에 액세스 할 수 있습니다. 의 라인을 따라

뭔가 :

IVSMDCodeDomProvider provider = SiteServiceProvider. 
     GetService(typeof(SVSMDCodeDomProvider)) as IVSMDCodeDomProvider; 

if (provider != null) 
{ 
    codeDomProvider = provider.CodeDomProvider as CodeDomProvider; 
} 

SiteServiceProvider 당신은 어떤 globally-을 요청할 수 있습니다 VS '주요 서비스 제공 업체 인 GlobalServiceProvider 반면 SingleFileGenerator의 사이트에 의해 노출 된 제한된 범위의 서비스 제공 업체입니다 범위 인터페이스.

희망이 도움이됩니다. 가레스

+0

사실이 코드는 CodeDomProvider를 제공합니다. 고맙습니다! – Charlie

관련 문제