質問

ようにしている解決への完全修飾名、c#の識別子であるポイント(カーソル)のコードで画面をマクロはも追加)Visual Studio2008年.

例えば、カーソルは"矩形"たいと思います。画します。矩形"を返します。

たって FileCodeModel.CodeElements.CodeElementFromPoint ものみの取得を含む方法またはクラス(その他)。

ここではできません用のマイクロの追加にも対がんの情報を頭に付けた)で使用可能で反射で読むc#ファイルの取得を希望。

役に立ちましたか?

解決

が可能となります。こちらのソリューション(回hacky)利用F1ヘる。するためにF1仕事、Visual Studioプの完全指定型名を現在の選択または挿入ポイントへのバッグの名前と値のペアという"F1ヘコンテキスト".が公開Apiは、Visual Studioするために使用されていますの照会、内容のF1ヘる。

できるようにするために、saneだをデバッグレジストリキーのためのF1ヘる。ことができますどのヘルプコンテキストはいつでも、oft-maligned動を助けます。このためには:

  1. 開始visual studioおよび選択的から、メニューです。
  2. セットのレジストリキーを下に必要なステップ#1をレジストリツリー)
  3. Visual Studioを再起動の変化
  4. 現在、動的なヘルプ]ウィンドウに移動がありますデバッグ出力できますので何F1ヘる。この回答について説明していくのでそのコンテキストプログラムでの追加に使用できます。

このレジストリキー:

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Dynamic Help]
"Display Debug Output in Retail"="YES"

このビデオをご覧になるとはF1のデバッグ出力、Visual Studioな明示的に伝えます"この識別子の型"です。その代わりに、単に付の完全指定型名の先頭には"ヘキーワード"のF1用においてます。例えば、できています。文字列VS.TextEditor、VS.周囲には支援のコンテキストだけのものであるにも関わらのコードです。

フレキシビリティを作ることが容易です:Visual Studioでのマークキーワードと文字と小文字を区別した場合はnullを返します。AFAIKの一部の映像スタジオでレコーディングの方法で得られる太の大文字と小文字は区別をキーワードはコードエディタの大文字-小文字の区別の言語(C#、C++)対応コードコンテキストそのため、フィルターすべてのキーワードの大文字と小文字は区別をキーワードから取り寄せた選りすぐりのんです。

残念ながら、C#の編集も進言語キーワードまたは識別子)を助の文脈の場合、挿入することなく、ポイントのトップ言語のキーワードとなります。必要になります画面出し語のキーワードは、次の二つの方法があります。できるだけ見ようだけで、あっという間に、タイプシステム、それらは有効でないタイプの名前(こんなのVS manglesして、例えば"string_CSharpKeyword"の文字列のキーワードできずに失敗し黙々と.またはを検出できなドットとなタイプの名前です。やきを検出することができ_CSharpKeyword接尾辞とを望VSチームなのです。:-)

別の可能性の問題はジェネリック医薬品.型の名前だからVSのための汎用タイプは以下のようなものです:

System.Collections.Generic.List`1 

法のようなものです:

System.Collections.Generic.List`1.FindAll.

する必要がありますのスマート約を検出するバックティック扱っています。

もう興味深い行動のような場合ASP.NET MVC.ASPXファイルが両方のC#コードおよびその他の大文字と小文字は区別コード(例:javascript)のページです。その場合、する必要がありますの属性です。のほか、キーワードは、文脈では"属性"は、名前と値のペアが、現在のコンテキスト例えば、devlang=索したい単語を一つの属性。以下のコードは使用できるプの属性です。必要な実験の権属性を見いだせにならないとjavascriptはその他の奇数のコードです。

というわけで、今はをご理解いただけ少なくとも目指してます!) すべての点、一部のコードをコンセントから抜きの大文字と小文字は区別したキーワードが存在していれば)から、どのようにして、名前と値のペアになっています。キーワードで名前と値のペアという名前"をキーワード").

ることに注意してくださいコードをVisual Studio SDKの定期VSインストール)の構築のために、ただくために、Microsoft.VisualStudio.しています。Interopでは、Microsoft.VisualStudio.シェルは、Microsoft.VisualStudio.OLE.Interopの名前空間(きょうを追加する必要があるとして文献にアドインプロジェクト)。

OK、楽しく幸運を祈っています。

using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.CommandBars;
using System.Resources;
using System.Reflection;
using System.Globalization;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.OLE.Interop;
using System.Collections.Generic;

public class HelpAttribute
{
    public string Name;
    public string Value;
    public VSUSERCONTEXTPRIORITY Priority;
    public VSUSERCONTEXTATTRIBUTEUSAGE Usage;
}

public class HelpContext2 : List<HelpAttribute>
{
    public static HelpContext2 GetHelpContext(DTE2 dte)
    {
        // Get a reference to the current active window (presumably a code editor).
        Window activeWindow = dte.ActiveWindow;

        // make a few gnarly COM-interop calls in order to get Help Context 
        Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)activeWindow.DTE;
        Microsoft.VisualStudio.Shell.ServiceProvider serviceProvider = new Microsoft.VisualStudio.Shell.ServiceProvider(sp);
        IVsMonitorUserContext contextMonitor = (IVsMonitorUserContext)serviceProvider.GetService(typeof(IVsMonitorUserContext));
        IVsUserContext userContext;
        int hresult = contextMonitor.get_ApplicationContext(out userContext);
        HelpContext2 attrs = new HelpContext2(userContext);

        return attrs;
    }
    public HelpContext2(IVsUserContext userContext)
    {
        int count;
        userContext.CountAttributes(null, 1, out count);
        for (int i = 0; i < count; i++)
        {
            string name, value;
            int priority;
            userContext.GetAttributePri(i, null, 1, out priority, out name, out value);
            VSUSERCONTEXTATTRIBUTEUSAGE[] usageArray = new VSUSERCONTEXTATTRIBUTEUSAGE[1];
            userContext.GetAttrUsage(i, 1, usageArray);
            VSUSERCONTEXTATTRIBUTEUSAGE usage = usageArray[0];
            HelpAttribute attr = new HelpAttribute();
            attr.Name = name;
            attr.Value = value;
            attr.Priority = (VSUSERCONTEXTPRIORITY)priority;
            attr.Usage = usage; // name == "keyword" ? VSUSERCONTEXTATTRIBUTEUSAGE.VSUC_Usage_Lookup : VSUSERCONTEXTATTRIBUTEUSAGE.VSUC_Usage_Filter;
            this.Add(attr);
        }
    }
    public string CaseSensitiveKeyword
    {
        get
        {
            HelpAttribute caseSensitive = Keywords.Find(attr => 
                attr.Usage == VSUSERCONTEXTATTRIBUTEUSAGE.VSUC_Usage_LookupF1_CaseSensitive
                || attr.Usage == VSUSERCONTEXTATTRIBUTEUSAGE.VSUC_Usage_Lookup_CaseSensitive
                );
            return caseSensitive == null ? null : caseSensitive.Value;
        }
    }
    public List<HelpAttribute> Keywords
    {
        get
        {
            return this.FindAll(attr=> attr.Name == "keyword");
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top