0

VSPackage 拡張機能を使用する Visual Studio Extensibility Framework は初めてです。MyToolWindow クラス内で呼び出されるユーザー コントロール内の DTE オブジェクトを取得したいと考えています。

以下の可能性をすべて試しました。

1.EnvDTE80.DTE2 dte2; dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0"); string solutionPath=dte2.Solution.FullName;

上記の試行は、開いているビジュアル スタジオの最初のインスタンスの SolutionPath のみを提供します。例: Math1.sln と Math2.sln を開いた場合、solutionPath には Math1.sln パスのみが割り当てられます。

  1. MSDNリンクから、「this.GetService」はbutton1.clickで認識できません(ここに何か欠けていますか)

DTE オブジェクトが取得されると、現在のインスタンスのソリューション名を簡単に取得できるようになります。

ユーザーコントロール内にあるボタンのクリック内で、適切な EnvDTE80.DTE オブジェクトを取得できる必要があります。このユーザー コントロールは、MyToolWindow.cs 内で呼び出されます。

これに関するヘルプは大歓迎です。

4

2 に答える 2

3

まず第一に、ランダムな Visual Studio インスタンスをMarshal.GetActiveObject("VisualStudio.DTE.10.0")提供するだけなので問題があります。呼び出しを通じてDTE正しいインスタンスを取得できます。次に、プロパティの 1 つをソリューション名にする必要があります。おそらく、現時点では確認できませんが。DTEGetServiceDTE.Solution.PropertiesDTE.Solution.Properties.Item("Name")

「GetServiceを認識できません」については、実装する上でメソッドが定義されてIServiceProviderToolWindowPaneます。コントロールでそれを使用する場合は、ツール ウィンドウ インスタンスをコントロールに渡す必要があります。例:

public class MyToolWindow: ToolWindowPane {
    void SomeMethod() {
        var myControl = new MyControl(this);
    }
}

public class MyControl: UserControl {
    public MyControl(IServiceProvider serviceProvider) {
        // Now you can call serviceProvider.GetService
    }
}
于 2013-01-08T09:35:29.277 に答える
0

私はすべての自家製拡張機能内で使用する抽象的なVsPackageクラスを持っています。この方法でアプリケーションインスタンスを取得します...

using EnvDTE80;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;

public abstract class VsPackage : Package
{
    ...

    protected DTE2 GetApplication()
    {
        return this.GetService(typeof(SDTE)) as DTE2; 
    }

    ...
}
于 2013-01-14T10:50:30.520 に答える