Visual Studio のアドイン のバックアップ(No.1) - PukiWiki

Visual Studio?

Visual Studio のアドイン
[edit]

このページのトップへ

問題
[edit]

MSDNに書いている通りだと、うまく削除できない。 http://msdn.microsoft.com/ja-jp/library/ms228765.aspx

このページのトップへ

アドインにアイコンを追加する
[edit]

「BMP」フォーマットの16*16サイズの写真のみサポートする。 参照URL:
http://msdn.microsoft.com/ja-jp/library/ms228771.aspx

このページのトップへ

アドイン開発プロジェクトの移動
[edit]

開発中のアドインプロジェクトフォルダを移動すると、アドインデバッグする際に、エラーとなる場合があります。
この問題に対して、プロジェクト内の「ServiceAddin - For Testing.AddIn」ファイルを開いて、下記の所に、

<Assembly>C:\Users\XXX\Desktop\ServiceAddin\bin\ServiceAddin.dll</Assembly>

移動した場所を新しく指定したら、治れます。

このページのトップへ

問題の対策
[edit]

このページのトップへ

コンパイルに通れない
[edit]

コンパイルする際に、ObjフォルダのXX.dllファイルはほかのプロセスによって、使用されてコンパイルできない場合、 他に起動しているVisual Studio 全部閉じたら、治れます。

このページのトップへ

アドインとして認識しない
[edit]

クラスライブラリの出力タイプと認識され、デバッグ出来ない現象の場合、下記のように設定すれば
プロジェクトのプロパティの「デバッグ」タグの中に

このページのトップへ

アドインの配置先
[edit]

参照URL:
http://msdn.microsoft.com/ja-jp/library/1326zbk3(VS.80).aspx
%ALLUSERSPROFILE%
C:\Documents and Settings\All Users\Application Data\Microsoft\MSEnvShared\Addins
%APPDATA%
C:\Documents and Settings\<username>\Application Data\Microsoft\MSEnvShared\Addins

%USERPROFILE%
C:\Documents and Settings\<username>\My Documents\Visual Studio 2005\Addins
%VSAPPDATA%
C:\Documents and Settings\<username>\Addins
%VSCOMMONAPPDATA%
C:\Documents and Settings\All Users\Addins

このページのトップへ

アドインから、プロジェクトの名前空間の取得
[edit]

using VSLangProj;7.033バージョンでよい
//名前空間の取得
VSProject vsproject_ =  (VSProject)project.Object;
MessageBox.Show(vsproject_.Project.Properties.Item("RootNamespace").Value.ToString());
このページのトップへ

ソリューションエクスプローラの右クリックメニューにアドイン追加
[edit]

下記のサンプルコードは、ソリューションエクスプローラの中にフォルダに対して、メニューにアドインを追加するサンプルです。

       public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
       {
           _applicationObject = (DTE2)application;
           _addInInstance = (AddIn)addInInst;
           if (connectMode == ext_ConnectMode.ext_cm_Startup || connectMode == Extensibility.ext_ConnectMode.ext_cm_Startup)
           {
               object[] contextGUIDS = new object[] { };
               Commands2 commands = (Commands2)_applicationObject.Commands;

               try
               {
                   CommandBar projBar = ((CommandBars)_applicationObject.CommandBars)["Folder"];
                   //コマンド コレクションにコマンドを追加します:
                   Command command = commands.AddNamedCommand2(_addInInstance,
                       "ServiceAddin",
                       "ServiceAddin",
                       "Executes the command for ServiceAddin",
                       true, 60, ref contextGUIDS,
                       (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled,
                       (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

                   command.AddControl(projBar, 1);

               }
               catch (System.ArgumentException ex)
               {
                   //同じ名前のコマンドが既に存在しているため、例外が発生した可能性があります。
                   //  その場合、コマンドを再作成する必要はありません。 例外を 
                   //  無視しても安全です。
                   //System.Windows.Forms.MessageBox.Show("ArgumentException : " + ex.Message + ex.StackTrace);
               }
               catch (Exception ex)
               {
                   System.Windows.Forms.MessageBox.Show("Exception : " + ex.Message + ex.StackTrace);
               }
           }

下記の「Folder」キーの指定によって、プロジェクトの中にフォルダの右クリックメニューにアドイン追加することが可能となる。

CommandBar projBar = ((CommandBars)_applicationObject.CommandBars)["Folder"];

ソリューションアイコンの右クリックメニューに追加する場合、「Solution」と指定する。
プロジェクト直下の各ファイルの右クリックメニューに追加する場合、「Item」と指定する。
ソリューションフォルダアイコンの右クリックメニューに追加する場合、「Solution Folder」と指定する。
ソースコード編集するWindowsの上に右クリックメニューに「競合の解決」のサブメニュー追加する場合、「Resolve」と指定する。

ソリューションとプロジェクトのエクスプローラのプロジェクトの上で右クリックして、出たメニューをカスタマイズするのは、特別な手段がいります。

このページのトップへ

プロジェクトアイテムの上に右クリックで出たメニューにアドインを追加
[edit]

プロジェクトアイテムの上に右クリックで出たメニューにアドインを追加の処理方法が以上と違います。
Visual Sutdio では、「Project」と命名したコマンドバーは一つではありませんので。

 //ボタンを保持するList(理由がわかりませんが、CommandBarButtonはほかのインスタンスで保持しないと、Clickイベントが動かないなので。)

 private readonly IList<CommandBarButton> _allocatedButtons;
 _allocatedButtons = new List<CommandBarButton>();

 //今コマンドバーの中にProjectと命名したコマンドバーすべてを検索する、名前があっているなら、アドインを追加する形に。
 foreach (CommandBar bar in (CommandBars)_applicationObject.CommandBars)
   {
       if (bar.Name.Equals("Project"))
       {
           CommandBarButton button = (CommandBarButton)bar.Controls.Add(MsoControlType.msoControlButton, Type.Missing, Type.Missing, 1, true);
           button.Caption = "SampleAddin";
           button.OnAction = "'button_ClickOnAction'";
           button.Click += new _CommandBarButtonEvents_ClickEventHandler(button_Click);

           _allocatedButtons.Add(button);
       }
   }
void button_Click(CommandBarButton Ctrl, ref bool CancelDefault)
{
   System.Windows.Forms.MessageBox.Show("***");
}
このページのトップへ

アドインのコマンド
[edit]

アドインプロジェクトの「Connect」クラスの中に、「QueryStatus」と「Exec」メソッドがあります。
この二つのメソッドの中に、下記のようなコマンドを判断するStatmentがあります。

if (commandName == "KHI.Tool.ServiceAgentCreator.Connect.ServiceAgentCreator")
{
    //....
}

ここの commandName のフォーマットは「名前空間+クラス名+追加したコマンドの名前」となります。
名前空間変更された場合とコマンドの名前を変更された場合、必ずここの二箇所を修正してください。

このページのトップへ

ボタンを配置すると自動的にFormの抽象クラスにメソッドが生成されるメール調査
[edit]

ボタンを配置すると自動的にFormの抽象クラスにメソッドが生成される
(partial だったらいけるのか..?)

この動作では、VSのアドインで、できないと思います。検証として、VSのアドインとマクロは同じの感じなものですので、マクロができ
ないことは、アドインのほうが多分もできません。(もしかしたら、できるかもしれませんが、相当難しいことになると思っております。)

ボタンを配置すると自動的にFormの抽象クラスにメソッドが生成されるマクロとアドインは、ソースコードファイルに対して、触ることができませ~

ん。まだ、CodeDomを利用しても、Formの抽象クラスにメソッドが生成するのが無理と思っております。現在抽象クラスの情報を読み込めませんので。

一つ案として、(結構無理やりなやり方)

ボタンのラッパークラスを作成し、InitLayout メソッドをオーバーライトして、ボタンが配置されたら、アドインでプロジェクトにボタンの関連 partial
アイテムを追加することが可能です、CodeDomを利用すると、ソースコードの中身もカスタマイズできますが、この方法だと、実行するたびに、このメソッドが
実行され、パフォマンス上では、よろしくないでしょう。もしかしたら、開発中では、この方法でやっていて、テスト、リリースする際に、このラッパークラス
の中に、partial アイテムを追加する部分を外しますとか、

参考したURL http://clr.mucleus.jp/003/001.html


このページのトップへ

EnvDteとVsLangProj同時に参照
[edit]

EnvDteとVsLangProj同時に参照する際に「EnvDTEを読み込めない」コンパイルエラーが発生するために、
ソリューションの Entry プロジェクトに以下の設定を追加します。

 <runtime>
   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <dependentAssembly>
       <assemblyIdentity name="EnvDTE" publicKeyToken="b03f5f7f11d50a3a"/>
       <bindingRedirect oldVersion="7.0.3300.0" newVersion="8.0.0.0"/>
     </dependentAssembly>
   </assemblyBinding>
 </runtime>

参考したURL http://msdn.microsoft.com/ja-jp/library/ms228768.aspx

このページのトップへ

EnvDTE
[edit]

このページのトップへ

プロジェクトにソースコードファイルの追加
[edit]

下記のソースコードを利用して、指定されているファイルをプロジェクトへ追加することですが

Project project = null;
SelectedItem selectItem = _applicationObject.Application.SelectedItems.Item(1);
project = selectItem.ProjectItem.ProjectItems.ContainingProject;
//追加するファイルのフルパス
string generateFileName = "....";
project.ProjectItems.AddFromFile(generateFileName);

ここの generateFileName 変数の中に @"C:\tmp\test\..\xxx.cs" みたいな途中に".."を入れて、親パスを指定するのはダメ。

このページのトップへ

EnvDTE で プロジェクトのプロパティ一覧を取得
[edit]

    StreamWriter writer = new StreamWriter(@"C:\tmp\property.csv",
                        false,
                        System.Text.Encoding.GetEncoding("Shift_JIS"));
       string contents = "";
       try
       {
           MessageBox.Show(project.Properties.Count.ToString ());
           for (int i = 1; i < project.Properties.Count; i++)
           {
               try
               {
                   if (project.Properties.Item(i) != null)
                   {
                       if (project.Properties.Item(i).Value != null)
                       {
                           contents += "Name : " + project.Properties.Item(i).Name +
                               ",Value : " + project.Properties.Item(i).Value.ToString() +
                               "\r\n";
                       }
                   }
               }
               catch
               {
                     //理由がわからない、ここでよく未知な例外は発生する
               }
           }
       }
       finally
       {
           writer.Write(contents);
           writer.Close();
       }
このページのトップへ

VSマクロで記録したサービス参照更新する際の動作
[edit]

       Sub TemporaryMacro()
	DTE.ActiveWindow.Object.GetItem("WCFSampleClient\WCFSampleCommunication\Service References").UIHierarchyItems.Expanded = True
	DTE.ActiveWindow.Object.GetItem("WCFSampleClient\WCFSampleCommunication\Service References\Proxy\Reference.svcmap\Reference.cs").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ActiveWindow.Object.DoDefaultAction
	DTE.Windows.Item("Reference.cs").Activate
	DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate
	DTE.ActiveWindow.Object.GetItem("WCFSampleClient\WCFSampleCommunication\Service References\Proxy\service.wsdl").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.Windows.Item("Reference.cs").Activate
	DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate
	DTE.ActiveWindow.Object.GetItem("WCFSampleClient\WCFSapmpleClient\app.config").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ActiveWindow.Object.DoDefaultAction
	DTE.Windows.Item("app.config").Activate
	DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate
	DTE.ActiveWindow.Object.GetItem("WCFSampleClient\WCFSampleCommunication\Service References\Proxy").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ActiveWindow.Object.GetItem("WCFSampleClient\WCFSampleCommunication\Service References").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ActiveWindow.Object.GetItem("WCFSampleClient\WCFSampleCommunication\Service References\Proxy").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ExecuteCommand ("Project.UpdateServiceReference")
	End Sub
このページのトップへ

VSマクロで記録したアイテムを削除する動作
[edit]

	Sub TemporaryMacro()
	DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate
	DTE.ActiveWindow.Object.GetItem("WindowsFormsApplication1\WindowsFormsApplication1\CustomControl1.bmp").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ExecuteCommand ("Edit.Delete")
	DTE.ActiveWindow.Object.GetItem("WindowsFormsApplication1\WindowsFormsApplication1\CustomControl1.css").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ExecuteCommand ("Edit.Delete")
	End Sub
このページのトップへ

VSマクロで記録したファイルの中を削除する動作
[edit]

	Sub TemporaryMacro()
	DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate
	DTE.ActiveWindow.Object.GetItem("KHI全体ビルド用\Service\KHI.ServiceAgent\Service References\KhiServiceReference\Arrays.xsd").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ActiveWindow.Object.GetItem("KHI全体ビルド用\Service\KHI.ServiceAgent\app.config").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ActiveWindow.Object.DoDefaultAction
	DTE.Windows.Item("app.config").Activate
	DTE.ActiveDocument.Selection.SelectAll
	DTE.ActiveDocument.Selection.Delete
	DTE.ActiveDocument.Save
	End Sub
このページのトップへ

VSマクロ記録したTFSチェックイン、元に戻す動作
[edit]

	Sub TemporaryMacro()
	DTE.ActiveWindow.Object.GetItem("KHI全体ビルド用\Service\KHI.ServiceAgent\IKhiServiceAgent.cs").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ExecuteCommand ("ClassViewContextMenus.ClassViewProject.TfsContextUndoCheckout")
	DTE.ActiveWindow.Object.GetItem("KHI全体ビルド用\Service\KHI.ServiceAgent\IKhiServiceAgent.cs").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.Windows.Item("KhiServiceAgentStub.cs").Activate
	DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate
	DTE.ActiveWindow.Object.GetItem("KHI全体ビルド用\Service\KHI.ServiceAgent\IKhiServiceAgent.cs").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ExecuteCommand ("ClassViewContextMenus.ClassViewProject.TfsContextCheckOutForEdit")
	DTE.Windows.Item("{131369F2-062D-44A2-8671-91FF31EFB4F4}").Activate 'チーム エクスプローラ
	DTE.ActiveWindow.Object.GetItem("172.30.117.188\SysrdcTeamProject\ソース管理").Select(vsUISelectionType.vsUISelectionTypeSelect)
	DTE.ActiveWindow.Object.DoDefaultAction
	DTE.Windows.Item("{99B8FA2F-AB90-4F57-9C32-949F146F1914}").Activate 'ソース管理エクスプローラ
	DTE.ExecuteCommand ("File.TfsUndoCheckout")
	DTE.Windows.Item("KhiServiceAgentStub.cs").Activate
	DTE.ExecuteCommand ("File.TfsUndoCheckout")
	DTE.Windows.Item("KhiServiceAgent.cs [読み取り専用]").Activate
	DTE.Windows.Item("{99B8FA2F-AB90-4F57-9C32-949F146F1914}").Activate 'ソース管理エクスプローラ
	DTE.ExecuteCommand ("File.TfsCheckOut")
	End Sub
このページのトップへ

EnvDTEで名前空間の取得
[edit]

                       //VSProject vsproject_ =  (VSProject)project.Object;
                       //MessageBox.Show(vsproject_.Project.Properties.Item("RootNamespace").Value.ToString());
このページのトップへ

标题: Addin的HELP zt
[edit]

(1)在OnConnection中,判断connectMode时,一定要加上ext_cm_AfterStartup

  if(connectMode == Extensibility.ext_ConnectMode.ext_cm_UISetup
   || connectMode == Extensibility.ext_ConnectMode.ext_cm_Startup
   || connectMode == Extensibility.ext_ConnectMode.ext_cm_AfterStartup) // this line will work when u choose addin in addin manager

这样子,在vs的Addin Manager中选中插件时,插件才会重新显示出来,一般的范例中,只有前$N个判断

(2)QueryState中,设置state时,要使用下面语句

   if( 是`O加入的command )
   {
    if( &#28385;足&#26174;示的条件 )
     status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
    else
     status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported;
   }
   else
    status = (vsCommandStatus)vsCommandStatus.vsCommandStatusUnsupported;

这样做,才能在条件不满足时,插件的菜单变灰

(3)判断代码窗口存在的方法是

(applicationObject.ActiveWindow != null) && (applicationObject.ActiveWindow.Type == vsWindowType.vsWindowTypeDocument)

就是说当前有活动窗口,而且其类型是文档类型

(4)在文档窗口插入字符的方法是

  TextSelection ts = (TextSelection)applicationObject.ActiveDocument.Selection;
  EditPoint ep = ts.ActivePoint.CreateEditPoint();
   
  ep.Insert(strCode);

当然,还可以调用EditPoint的其它方法,来实现删除,替换等等

このページのトップへ

テストプロジェクト
[edit]

このページのトップへ

DeploymentItem
[edit]

コピーするファイルはbin/Debugフォルダからみる相対パス

       [DeploymentItem(@"..\..\DeploymentItem\Message\Message.resources",
       @"Message")]

このようにテストメソッドに指定をすると、TMessage.resourcesが
C:\\solution\TestResults\user_machine yyyy-mm-dd hh_mm_ss\Out\Message\Message.resources
と準備されます。

このページのトップへ

カバレッジ
[edit]

http://msdn.microsoft.com/ja-jp/library/ms182534(VS.80).aspx

このページのトップへ

テスト対象
[edit]

private として宣言するメソッドのテストはしなくてもいいだが、Internal のほうが場合によって、テストする必要が場合もあります。例えば、ある Internal は自己担当外とか、基本的にテストしなくてもよい。

このページのトップへ

メタデータの取得
[edit]

Net.tcp バインディングのメタデータを取得する際に、下記のエラーが出る場合、

{"受信メッセージの最大メッセージ サイズ クォータ (65536) を超えました。このクォータを増やすには、適切なバインド要素の MaxReceivedMessageSize プロパティを使用してください。"}
                   //受信メッセージの最大メッセージ サイズ を設定する。
                   TcpTransportBindingElement tcpBindingElement =new TcpTransportBindingElement();
                   tcpBindingElement.MaxReceivedMessageSize *= 5;

                   CustomBinding binding = new CustomBinding(tcpBindingElement); 

                   client = new MetadataExchangeClient(binding);
                   client.MaximumResolvedReferences = 6553500;
                   client.OperationTimeout = DateTime.Now.AddSeconds(60) - DateTime.Now ;
                   client.ResolveMetadataReferences = true;
                   resultMetaData = client.GetMetadata(address,MetadataExchangeClientMode.MetadataExchange );
このページのトップへ

WebService WCF にOutのパラメータがある場合、認識きない証拠
[edit]

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/7e723844-d219-45af-9714-4b860988c402/


コメント:




トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

G|Cg|C@Amazon Yahoo yV

z[y[W yVoC[UNLIMITȂ1~] COiq COsیI