質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

570閲覧

IVsUpdateSolutionEventsの使い方が知りたい

user111

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

1グッド

0クリップ

投稿2021/11/13 07:30

前提・実現したいこと

VisualStudioでメニューバー下のソリューションの構成を変更した際に(Debug→Release)
ポップアップメッセージが表示されるようなVisualStudioの拡張機能を作成しようとしています。

IVsUpdateSolutionEvents.OnActiveProjectCfgChangeを使えば
それらしいことが出来そうな気がしているのですが
どのように使用すればよいかがわかりません。

ご教示お願いいたします。

※初めて拡張機能を作成するので、やろうとしていることが根本的に間違えているかもしれません。

試したこと

新しいプロジェクトの作成から、「VSIX Project」で作成し
デフォルトの以下のソースが出来上がるところまでは行きました。
その後、IVsUpdateSolutionEventsをどう使用すれば良いかがわかりません。

namespace VSIXProject7 { [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] [Guid(VSIXProject7Package.PackageGuidString)] public sealed class VSIXProject7Package : AsyncPackage { /// <summary> /// VSIXProject7Package GUID string. /// </summary> public const string PackageGuidString = "b6005e9e-9c26-40c5-a8a8-c49203a4f97b"; #region Package Members protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress) { await this.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); } #endregion Package Members } }

補足情報(FW/ツールのバージョンなど)

VisualStudio2022 RC3

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

拡張機能を作りやすくする拡張機能が出ています。
VSIX Cookbook | Visual Studio Extensibility Cookbook

VSIX Project (Community)テンプレートで作ります。
変更するのはVSIXProject1Package.csのみ、他はデフォルトのままです。

cs

1global using System; 2global using Community.VisualStudio.Toolkit; 3global using Microsoft.VisualStudio.Shell; 4global using Task = System.Threading.Tasks.Task; 5using System.Diagnostics; 6using System.Runtime.InteropServices; 7using System.Threading; 8using Microsoft.VisualStudio; 9using Microsoft.VisualStudio.Shell.Interop; 10 11namespace VSIXProject1 12{ 13 [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] 14 [InstalledProductRegistration(Vsix.Name, Vsix.Description, Vsix.Version)] 15 [ProvideMenuResource("Menus.ctmenu", 1)] 16 [Guid(PackageGuids.VSIXProject1String)] 17 18 // 追加(ソリューションを開いているときにこの拡張をロード) 19 [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string, PackageAutoLoadFlags.BackgroundLoad)] 20 public sealed class VSIXProject1Package : ToolkitPackage 21 { 22 protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress) 23 { 24 Debug.WriteLine("InitializeAsync"); 25 26 await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); 27 28 // 追加(イベントハンドラ追加) 29 VS.Events.BuildEvents.ProjectConfigurationChanged += BuildEvents_ProjectConfigurationChanged; 30 } 31 32 // 以下追加 33 private async void BuildEvents_ProjectConfigurationChanged(Project obj) 34 { 35 // 変わったことだけ分かればいいのならこれだけでいい 36 //VS.MessageBox.Show("ProjectConfigurationChanged", "何か変わりました"); 37 38 39 // IVsProjectCfgを取るには今のところこうやるしかない? 40 await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); 41 42 obj.GetItemInfo(out var hierarchy, out _, out _); 43 var projectConfig = new IVsProjectCfg2[1]; 44 45 var svc = await VS.Services.GetSolutionBuildManagerAsync(); 46 svc.FindActiveProjectCfg(IntPtr.Zero, IntPtr.Zero, hierarchy, projectConfig); 47 48 projectConfig[0].get_CanonicalName(out var name); 49 50 VS.MessageBox.Show("ProjectConfigurationChanged", name); 51 } 52 } 53}

現在絶賛開発中だと思うので、そのうちもっと簡単になるかもしれません。
VsixCommunity/Community.VisualStudio.Toolkit: Making it easier to write Visual Studio extensions


構成を取るのにかなりてこずりました^^;

わたしもしょうもない拡張機能をひとつ作ってるんですが、実例みたいのがあまりなくって苦労しますねぇ。
情報自体はDocsに全てあるんでしょうけど^^;

投稿2021/11/13 10:31

編集2023/07/29 08:29
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

user111

2021/11/13 12:17

こんばんわ、ご回答ありがとうございます。 教えていただいた方法でできました。 何をやっているのかわからない所しかないので これから頑張って解読します。 > 実例みたいのがあまりなくって苦労しますねぇ。 ホントそうですよね。 IVsUpdateSolutionEventsでググってヒット数52件。 茨の道な予感しかしなかったです。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問