4

Python Tools for Visual Studio 2.0 の一部である C# プラグインを変更しました。コード内の Debug.WriteLine および Trace.WriteLine ステートメントからの出力を確認したいと考えています。プラグインは Visual Studio 2013 自体で使用され、python プロセスのデバッグを変更することに注意してください....

ここの PTVS ディスカッション フォーラムでdevenv.exe.configpminaev が提案したように、トレース リスナーを追加できることを願っています(VS 自体に別の VS を接続するのは面倒なので、それを避けたいと考えています)。

他の .NET アプリケーションの正しい構成であると私が信じていることは、VS2013 自体では機能しないようです。 私の努力は以下に文書化されています。

誰かがプラグインのデバッグ/トレース出力を Visual Studio コンソール (または別の接続された VS インスタンスよりも便利な場所) にリダイレクトできた場合は、ヒントをいただければ幸いです....


私のGoogle-fuは、追加しようとしたことに基づいて、いくつかの例を見つけました...

<system.diagnostics>
    <trace autoflush="true" />
        <listeners>
            <add name="myConsoleTraceListener" type="System.Diagnostics.ConsoleTraceListener" />
        </listeners>
    </trace>
</system.diagnostics>

...と...

<system.diagnostics>
    <source name="System.ServiceModel.MessageLogging" switchValue="Verbose, ActivityTracing">
        <listeners>
            <add name="myTraceListener" />
        </listeners>
    </source>
    <sharedListeners>
        <add name="myTraceListener" type="System.Diagnostics.ConsoleTraceListener" />
    </sharedListeners>
</system.diagnostics>

その後PTVSを起動しても何も使えません。どちらの構成でも、ポップアップが表示されます。

The `Python Tools Package' package id not load correctly.

The problem may have been caused by a configuration change or by
the installation of another extension.  You can get more information by
examining the file
'C:\Users\XXX\AppData\Roaming\Microsoft\VisualStudio\12.0\Acti
vityLog.xml'.

ActivityLog は私にはあまり意味がありません:

<entry>
    <record>41</record>
    <time>2014/05/12 07:52:47.851</time>
    <type>Error</type>
    <source>VisualStudio</source>
    <description>CreateInstance failed for package [Python Tools Package]</description>
    <guid>{6DBD7C1E-1F1B-496D-AC7C-C55DAE66C783}</guid>
    <hr>80131604</hr>
    <errorinfo>Exception has been thrown by the target of an invocation.</errorinfo>
</entry>
<entry>
    <record>42</record>
    <time>2014/05/12 07:52:47.851</time>
    <type>Error</type>
    <source>VisualStudio</source>
    <description>End package load [Python Tools Package]</description>
    <guid>{6DBD7C1E-1F1B-496D-AC7C-C55DAE66C783}</guid>
    <hr>80004005 - E_FAIL</hr>
    <errorinfo>Exception has been thrown by the target of an invocation.</errorinfo>
</entry>

リモートの python プロセスにアタッチしようとすると、別のポップアップが表示されます。

Unable to connect to 'secret@server'.  Operation not supported.
Unknown error: 0x80131902.

Google-foo は、これが .NET バージョンの読み込みに失敗したことを示唆しています...?

4

1 に答える 1

1

私が書いたプラグインに似たようなことをしたかった: pMixins . System.Diagnostics の代わりに log4net を使用しましたが、ログ メッセージを Visual Studio 出力ウィンドウにルーティングしたいと考えていました。

構成ベースのアプローチが機能することはなく、プログラムで配線を行うことになりました。さらに、Visual Studio 出力ウィンドウに書き込むカスタム ログ ライターを作成する必要がありました。

私のパッケージ ファイル ( https://github.com/ppittle/pMixins/blob/master/pMixins.VSPackage/pMixinsVisualStudioCodeGenerateInitializer.cs ):

protected override void Initialize()
{

      //Create a Visual Studio Writer
       _visualStudioWriter = new VisualStudioWriter(dte, this);

      //Initialize Logging
      Log4NetInitializer.Initialize(_visualStudioWriter, this);
 }

VisualStudioWriter (概要) ( https://github.com/ppittle/pMixins/blob/master/pMixins.VSPackage/Infrastructure/VisualStudioWriter.cs ):

public class VisualStudioWriter : IVisualStudioWriter
{  
    private EnvDTE.OutputWindowPane _outputWindowPane;

    public VisualStudioWriter(DTE dte, System.IServiceProvider serviceProvider)
    {                      
        _outputWindowPane = LoadOutputWindowPane(dte);
    }

    private EnvDTE.OutputWindowPane LoadOutputWindowPane(DTE dte)
    {
        const string windowName = "pMixins Code Generator";
        EnvDTE.OutputWindowPane pane = null;
        EnvDTE.Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);
        if (window != null)
        {
            EnvDTE.OutputWindow output = window.Object as EnvDTE.OutputWindow;
            if (output != null)
            {
                pane = output.ActivePane;
                if (pane == null || pane.Name != windowName)
                {
                    for (int ix = output.OutputWindowPanes.Count; ix > 0; ix--)
                    {
                        pane = output.OutputWindowPanes.Item(ix);
                        if (pane.Name == windowName)
                            break;
                    }
                    if (pane == null || pane.Name != windowName)
                        pane = output.OutputWindowPanes.Add(windowName);
                    if (pane != null)
                        pane.Activate();
                }
            }
        }
        return pane;
    }

    public void OutputString(string s)
    {
        _outputWindowPane.OutputString(s);
    }
 }

Log4NetInitializer (概要) https://github.com/ppittle/pMixins/blob/master/CopaceticSoftware.CodeGenerator.StarterKit/Logging/Log4NetInitializer.cs

public static class Log4NetInitializer
{
    public static void Initialize(IVisualStudioWriter visualStudioWriter,
                       IServiceProvider serviceProvider)
    {
       //http://stackoverflow.com/questions/650694/changing-the-log-level-programmaticaly-in-log4net
       var outputWindowAppender =
           new VisualStudioOutputWindowAppender(visualStudioWriter)
           {
               Layout =
                       new PatternLayout(@"%date{HH:mm:ss,fff} %thread% %-5level [%logger{2}] %message%newline"),
                    Threshold =
                    #if DEBUG
                     Level.Debug
                     #else
                    Level.Info
                        #endif
           };


       log4net.Config.BasicConfigurator.Configure(
                outputWindowAppender);                

    }
}

最後に、VisualStudioOutputWindowAppender ( https://github.com/ppittle/pMixins/blob/master/CopaceticSoftware.CodeGenerator.StarterKit/Logging/VisualStudioOutputWindowAppender.cs )

public class VisualStudioOutputWindowAppender : AppenderSkeleton
{
    public IVisualStudioWriter OutputWindow { get; set; }

    public VisualStudioOutputWindowAppender(IVisualStudioWriter outputWindow)
    {
        OutputWindow = outputWindow;

        Layout = new PatternLayout("%-5level %logger - %message%newline");
    }

    protected override void Append(LoggingEvent loggingEvent)
    {
        if (null == OutputWindow)
            return;

        if (null == loggingEvent)
            return;

        OutputWindow.OutputString(RenderLoggingEvent(loggingEvent));
    }
}

役立つことを願っています

于 2014-06-26T10:37:12.550 に答える