Как получить доступ к CodeDomProvider из класса, унаследованного от Microsoft.VisualStudio.TextTemplating.VSHost.BaseCodeGeneratorWithSite? - PullRequest
0 голосов
/ 23 июля 2010

Кто-нибудь знает, как получить CodeDomProvider в новом Microsoft.VisualStudio.TextTemplating.VSHost. BaseCodeGeneratorWithSite из Visual Studio 2010 SDK?Раньше я получал доступ к нему просто путем наследования класса Microsoft.CustomTool.BaseCodeGeneratorWithSite, но теперь с этим новым классом его нет.Я вижу GlobalServiceProvider и 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 Ответ

1 голос
/ 03 августа 2010

Вы можете получить доступ к CodeDomProvider через SiteServiceProvider, запросив службу SVSMDCodeDomProvider.

Что-то вроде:

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

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

SiteServiceProvider - поставщик услуг с ограниченной областью действия, предоставляемыйсайт SingleFileGenerator, тогда как GlobalServiceProvider является основным поставщиком услуг VS, к которому вы можете обратиться за любым глобально-ориентированным интерфейсом.

Надеюсь, это поможет.Gareth

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...