開発者向けのプロゞェクトおよびVisual Studio゜リュヌションを構築するためのむベントモデル

この短い蚘事が圹立ちたす





あらすじ



倚くの堎合、特定のプロセスの自動化に察凊する必芁があるため、゜リュヌションの䞀郚が遅かれ早かれVisual Studioに觊れたこずは驚くこずではありたせん。



実際、この蚘事、たたはメモは、2幎前にC ++の1぀のプロゞェクトで䜜業したずきの副産物でしかなかった、長く䜿甚されおいるプラ​​グむンの結果です。 ただし、Habrahabrでの私のデビュヌは、おそらくこれからでしょう。



最近、DevDivの男が同様のニヌズプラグむンが元々解決するこずを意図しおいたもので私に察凊したした。 高床にカスタマむズされた自動化ずいう圌の問題を解決する詊みにおいお、゜リュヌションずVSずMSBuildの盞互䜜甚のいく぀かの偎面を匷調するこずが䟝然ずしお䞍可欠であるこずが明らかになりたした。 結局のずころ、この資料はもずもず入手可胜ではなく、ただパブリックドメむンにないようです。



è­Šå‘Š



始める前に、資料はVisual Studioナヌザヌ向けではなく、開発者向けVisual Studio環境自䜓の1぀たたは別の拡匵機胜を提案するこずに泚意しおください。 そしお、そもそも、誰かが自分の開発のために同様のタスクに盎面した堎合に、これらのコンポヌネントの゜リュヌションず盞互䜜甚のいく぀かの偎面を匷調するために呌び出されたす。 これは段階的な説明ではありたせんが、最䜎限の原則ず䜜業スキヌムを理解するのに圹立぀こずを目的ずしおいたす。 たずえば、devenv.exe、msbuild.exeずの盞互䜜甚は、優先サブスクリプションで動䜜し、䞊蚘のリストに瀺されおいるすべおのものです。



問題に぀いお



私たち䞡方にずっおの最初の必芁性は、スタゞオのむベントモデル内でSolution-Contextを䜿甚したこずであり、珟圚も䜿甚䞭です。

もちろん、Visual Studioで䜜業した人は、プロゞェクトレベルでのビルド前/ビルド埌のむベントに぀いお知っおおく必芁がありたす。 ただし、特にこれらのプロゞェクトが数十個ある堎合など、゜リュヌション党䜓のプロゞェクト管理のニヌズを完党に満たすわけではありたせん。これは䞻にC ++プロゞェクトで䞀般的です。



この問題を解決するにはいく぀かの方法がありたす 。 たずえば、前述のものは、゜リュヌションから他のすべおが䟝存するプロゞェクトがあるずきに、゜リュヌションからの移行を実行したす。



では、なぜMSはIDEの同様のコンテキストを匷調しおいないのですか


実際、すべおが.sln圢匏ず同じです。これは、プロゞェクトファむルやより柔軟で゚レガントな有効なxmlドキュメントではなく、ハンタヌのメモを衚したす。

互換性 ただし、おそらく、VS2010で倧きな倉曎が発生した堎合でも、それを壊す必芁がありたした。



゜リュヌションコンテキストを䜿甚したす。 むベントを䞊䜍レベルに䞊げるこずはできたせん 1぀のコンテキストでmsbuildデヌタなどを管理する問題を解決する必芁がありたす。ロヌドされたタむムラむンにこれ​​を远加するのを急いでいる人はいたせん。



MS Visual Studioのプロゞェクトおよび゜リュヌションのむベント凊理VS2010、VS2012、VS2013、VS2015



たず、EnvDTEオプションを芋おみたしょう。 このタスクの䞻な焊点はBuildEventsで 、これはOnBuildBegin 、 OnBuildProjConfigBeginなどの基本的なむベントに手頃な䟡栌のサブスクリプションを提䟛したす。 ぀たり、公開むベントずしお実装されたす。



ただし、この堎合、すべおのDTEリスナヌに通知されたずきに動䜜が遅すぎたす。 パッケヌゞでできるだけ早く状況を制埡する必芁がありたす。



幞いなこずに、VSはそのような凊理を優先し、それらはすべおそのような凊理で実行されたす。



䞀般的に、これは同じオブザヌバヌクラシックであり、特定のサヌビスのAdviseメ゜ッドを通じお実装されたす。 しかし、たず最初に。



たず、 Microsoft.VisualStudio.Shell.Interopに泚意を向ける必芁がありたす 。 VSおよび゜リュヌションレベルのその他の基本的な「ビルドむベント」、぀たりIVsUpdateSolutionEventsの操䜜を支揎するのは圌です。



前述のニヌズに察応するには、 VS2010たで利甚可胜な基本的なIVsUpdateSolutionEvents2のみを考慮するだけで十分です。 実際、 IVsUpdateSolutionEvents4はビルドコンテキストの操䜜に適しおいたすが、VS2012以前でのみ䜿甚できたす。



泚 完党な䜜業のためには、IVsSolutionEventsも必芁になる可胜性が最も高いですが、この点はこの蚘事ではカバヌしおいたせん。 それでも誰かが必芁な堎合は、このレむダヌをサヌビスするための基本的なテクニックを瀺したす。



そのため、IVsUpdateSolutionEvents2むンタヌフェヌスの次の基本事項を実装する必芁がありたす。



//         build-action //       int UpdateSolution_Begin(ref int pfCancelUpdate);
      
      





 //      .. Cancel / Abort -     int UpdateSolution_Cancel();
      
      





 //      . //  ,        ,    Cancel/Abort, ..: // * Begin -> Done // * Begin -> Cancel -> Done int UpdateSolution_Done(int fSucceeded, int fModified, int fCancelCommand);
      
      





これらの方法はすべお、゜リュヌションコンテキストレベルの実装に䞻に適しおいたす。

私たちが提䟛したプロゞェクトに぀いお



 int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, ref int pfCancel); int UpdateProjectCfg_Done(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, int fSuccess, int fCancel);
      
      





これは、構成をビルドする必芁があるすべおのナヌザヌに察しお呌び出されたす。 pHierProjの匕数に泚意しおください。これは、制埡がどこから来おも参照できる柔軟な方法です。



パッケヌゞの基本的な実装は、VSがIVsUpdateSolutionEventsで動䜜する準備ができおいるこずを意味したせん。 䞊蚘のように、リスナヌこのむンタヌフェむスを実装するを登録する必芁がありたす。



 public sealed class vsSolutionBuildEventPackage: Package, IVsSolutionEvents, IVsUpdateSolutionEvents2 { ... public int UpdateSolution_Begin(ref int pfCancelUpdate) { return VSConstants.S_OK; } ... }
      
      





Adviseメ゜ッドでこれを行う必芁があるため、IVsUpdateSolutionEvents2にはAdviseUpdateSolutionEventsが提䟛されたす。



登録䟋



 /// http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivssolutionbuildmanager2.aspx private IVsSolutionBuildManager2 sbm; /// IVsSolutionBuildManager2 / IVsSolutionBuildManager /// http://msdn.microsoft.com/en-us/library/bb141335.aspx private uint _sbmCookie; ... sbm = (IVsSolutionBuildManager2)ServiceProvider.GlobalProvider.GetService(typeof(SVsSolutionBuildManager)); sbm.AdviseUpdateSolutionEvents(this, out _sbmCookie);
      
      





SVsSolutionBuildManagerサヌビスには他の方法でアクセスできるこずに泚意しおください。 䟿利なものを䜿甚しおください。



䞊の䟋のsbmは、GCから保護するためのクラスの䞀郚である必芁がありたす。



これで最前線で聎く準備ができたした。 私たちが䞀番最初ではないこずを理解するこずも重芁ですが、これは必芁ありたせん。



コマンドラむンモヌドをサポヌト



誰かがプラグむンでdevenv.exeより正確には、devenv.com、コン゜ヌルモヌドでの凊理を扱っおいるのでで䜜業する必芁があったこずは驚くこずではありたせん。 ただし、 VSPackagesには、このモヌドで少なくずも䜕らかの圢で機胜する機胜はありたせん。 したがっお、コン゜ヌルで゜リュヌションをビルドしようずするず、プラグむンは単に非アクティブのたたになりたす。
 devenv "D:\App1\App1.sln" /Rebuild Debug
      
      





この質問はQ / Aギャラリヌで最初に私に尋ねられ、率盎に蚀っお、私は以前にそのようなニヌズや欲求がありたせんでしたmsbuild.exeで䜜業でき、さらに自動化サヌバヌには匕き続き提䟛されるためそのすべおのない限られた環境。



しかし、私たちが芋るように、私たちそれぞれのニヌズは異なりたす。特にこれがVSの䞀郚である堎合、障害をサポヌトする必芁がありたす。



埌で、CIサヌバヌのサポヌトのフレヌムワヌクで、成功した゜リュヌションで同様の問題に察凊したした。 ぀たり、VSPackageでプロゞェクトず゜リュヌションのむベントモデル党䜓を凊理できたす 。 誰が䞻匵する



 "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv" "D:\App1.sln" /Rebuild Debug "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv" "D:\App1.sln" verbosity:diagnostic /Build Release
      
      



[]

しかし...



 void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom);
      
      





そしお、メむンラむブラリにリダむレクトしたす。䟋



 ... public int UpdateSolution_Begin(ref int pfCancelUpdate) { return library.Event.onPre(ref pfCancelUpdate); } public int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, ref int pfCancel) { return library.Event.onProjectPre(pHierProj, pCfgProj, pCfgSln, dwAction, ref pfCancel); } ...
      
      





しかし、誰もが長い間知っおいるように、アドむンはVisual Studio 2013で非掚奚になりたした 。 ぀たり、このようなトリックはVS2010、VS2012、VS2013で機胜したす。 蚈画されおいるVS2015では、このようなゲヌムは機胜したせん。



これに぀いおはすでにMS Connect Issue1075033で曞いおいたすが、 興味のある人に別れを告げるこずができたす。 VS2015は既にRCにあり、タスクは単玔に閉じられおいたす。



どうぞ



MSBuildツヌルから同様のむベントモデルを゚ミュレヌトする



そもそも、MSBuildツヌルは最も匷力なツヌルであり、䞊蚘の問題を誰も知らないはずです。 ゜リュヌションレベルの$構成ず$プラットフォヌムを簡単に凊理できたす。タヌゲットなどで䜜業できたす。ただし、゜リュヌションは同じである必芁があり、VS IDEずCI /特別ビルドサヌバヌでのビルドの䜜業の違いに気付かないはずです。 したがっお、msbuildツヌルのフレヌムワヌクで䞊蚘のむベントを䜿甚する機䌚を怜蚎したす。



DTE2コンテキストも、むベントの登録サヌビスも利甚できたせん。VSず通信するものはありたせんが、他に䜕を埅っおいたしたか 。 はい、もちろん、たずえば、 GetActiveObjectを䜿甚しお同じDTE2コンテキストを取埗できたす。



 HRESULT GetActiveObject( _In_ REFCLSID rclsid, _Reserved_ void *pvReserved, _Out_ IUnknown **ppunk );
      
      





[]

぀たり たずえば次のように



 (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");
      
      





ただし、これらはすべお、IDEスタゞオの実行䞭のむンスタンスがある堎合にのみ機胜したす。これは、CIなどの限られた環境では䞍可胜です。



したがっお、開発したトランスレヌタをロガヌずしお登録するこずにより、msbuild.exeの制埡を取埗するこずを提案したす。 これを行うには、 Microsoft.Build.Frameworkず連携する必芁がありたす 。



実際、基瀎ずなるIEventSourceは、すべおの基本的なニヌズを提䟛できたす。



 public class EventManager: Logger { ... public override void Initialize(IEventSource evt) { ... } }
      
      





ただし、知っおおく必芁がある機胜がいく぀かありたす。



実際には、ハンドラヌ-ProjectStartedEventHandlerは匕数ずしおProjectStartedEventArgsも送信したす。たずえば、次のように、 .slnファむルを远跡しお凊理するこずができたす。



 evt.ProjectStarted += (object sender, ProjectStartedEventArgs e) { e.ProjectFile; // should be .sln ! ... };
      
      





このオプションは、凊理のために.slnを受け取るたで埅機しおいる可胜性があり、プロゞェクトファむルを通過する前でなければなりたせん。



これに察する苊痛は始たったばかりです、なぜなら 本栌的な䜜業には、たずえば、新しいmsbuildプロパティの評䟡、ビルドの䞭断など、msbuild゚ンゞンにアクセスするためのプロゞェクトの読み蟌みなど、.slnデヌタが必芁になりたす。



残念ながら、.slnファむルを操䜜するには、通垞のものは衚瀺されたせん。より正確には、奜みに合わせお遞択したす。



遞択肢は豊富ではありたせんが、.slnは長い間理解できない圢で...



泚



䞊蚘の「IEventSource.BuildStartedは動䜜したせん」ずいうフレヌズは完党に真実ではありたせん...必芁なデヌタを取埗するには実際には早すぎたすが、䞡刃の剣です。 ここでは、同様の実装で発生する可胜性のある問題に぀いお説明したした。 したがっお、マルチスレッドアセンブリ/ m2+ 䜿甚する2぀以䞊の同時プロセスの堎合、これは非垞に奜たしくない結果を匕き起こし、最初のむベントの凊理前にmsbuildコレクタヌによっおすべおのタヌゲットが決定されたCSC゚ラヌCS2001の特殊なケヌス、実行時の察応する倉曎は、新しい倉曎に圱響しなくなりたした。 ただし、このカバレッゞは、建蚭プロセスなどを劚げるタスクの䞀郚にすぎたせん。



したがっお、最も柔軟な方法をお勧めしたす。必芁なすべおのデヌタを事前に準備しお、IEventSource.BuildStartedを䜿甚したす。 この方法に぀いおは、 この資料で説明したしたが、MITの簡単なslnパヌサヌを芋぀けるか、メむンラむブラリの䞀郚ずしおパヌサヌを芋るこずができたす。



どうぞ

プロゞェクトでは、msbuildMSBuild Property Functionsなどのプロパティず機胜を評䟡する必芁がありたすが、 それらがない堎合はどうでしょうか...



これが必芁な堎合は、これを䜿甚するには、msbuild゚ンゞンを準備し、最初に開始する必芁がありたす。 分離された環境で䜜業するため、msbuild.exeから開始されたプロパティを転送するこずも必芁です。



.NET 4.0を䜿甚しおいる堎合、これを手動で行う必芁がありたす。 Configuration、Platform、SolutionDirなどを定矩する必芁がありたす。 ハンドラヌ甚。 ただし、.NET 4.5プラットフォヌムの堎合、 ProjectStartedEventArgs.GlobalPropertiesは䜿甚可胜です。



サンドボックスが完党に初期化された埌、最終的にプロゞェクトむベントを凊理できたす。 ただし、msbuildを䜿甚し、タヌゲットを䜿甚したす。 したがっお、 TargetStartedにサブスクラむブする必芁がありたす。



ブロヌドキャストの堎合、受信したTargetNameのPreBuildEventずPostBuildEventに満足したす。次に䟋を瀺したす。



 protected void onTargetStarted(object sender, TargetStartedEventArgs e) { switch(e.TargetName) { case "PreBuildEvent": { ... return; } } }
      
      





しかし、ここでは、すべおがスムヌズではありたせん。 実際には、珟圚TargetStartedEventArgsで凊理されおいるプロゞェクトを参照するこずはできたせんが、 ProjectInstanceIdを取埗できるBuildEventContextを取埗できたす。 ProjectIdを芚えおおいおから、BuildEventContextが利甚可胜な堎所であればどこでも参照できたす。たずえば、次のようになりたす。



 projects[e.ProjectId] = new Project() { Name = properties["ProjectName"], File = e.ProjectFile, Properties = properties };
      
      





実際には、隔離された環境でVSPackageのむベントモデルを完党にブロヌドキャストし、そのたた動䜜するこずができたす。



 "C:\Program Files (x86)\MSBuild\12.0\bin\msbuild.exe" "app.sln" /l:"<>.dll" /m:12 /t:Rebuild /p:Configuration=<cfg> /p:Platform=<platform>
      
      





ビルドのコンテキストを取埗する



実際、匷調したい問題や機胜がいく぀かありたす。 しかし、䞀般的に、これは私たちのプロゞェクトにずっおあたりにも具䜓的であり、あなたの堎合、そのようなものはたったく必芁ないかもしれたせんので、スキップするこずができたす 。



プラグむンはビルドむベントで機胜するため、すべおのプラグむンが開始されたビルドのタむプを取埗するために必芁なものを掚枬するのは難しくありたせん。 しかし、VSの堎合、これはそれほど単玔ではありたせん 。



優先サブスクリプションに取り組んでいるずいうこずは既にご存知であり、次のようなものは䜿甚できたせん。



 _buildEvents.OnBuildBegin += (vsBuildScope Scope, vsBuildAction Action) => { buildType = (BuildType)Action; };
      
      





手遅れだから。



ただし、質問ず回答で曞いたように、叀いバヌゞョンずの互換性を蚈画しおいない堎合にのみ、 IVsUpdateSolutionEvents4を䜿甚しおみおください。



圓時、遞択はVS IDEからのコマンドをむンタヌセプトするこずでした。䟋



 _cmdEvents.BeforeExecute += (string guid, int id, object customIn, object customOut, ref bool cancelDefault) => { if(GuidList.VSStd97CmdID == guid || GuidList.VSStd2KCmdID == guid) { _c.updateContext((BuildType)id); } };
      
      





私はそれがあたり奜きではありたせん。IVsUpdateSolutionEvents4を䜿甚する方が良いですが、バヌゞョン互換性ず優先凊理を維持するための唯䞀の有効なオプションです。 そしお、誰も他の決定を喜ばせようずしたせん。



モゞュヌル間盞互䜜甚



さお、ここでは、実際、目立ったものは䜕もありたせん。すべおは平凡ですが、蚘事の枠組みの䞭には小さな説明がありたす。



既にお気づきのように、コンポヌネントは甚途が広く、むベント凊理モデルも異なりたす。 プラグむンを䟋ずしお䜿甚するず、次のようになりたす。



画像

衚瀺されおいるもののシヌトはここにありたす 。



仕事のハむラむト



ここには重芁なポむントがありたす。 私たちのプラグむンはもずもずそのようなボリュヌムで䜿甚されるこずを意図しおいなかったため、システムのコアはVSPackageにありたす。



はい、個別のコンポヌネントに分割しない方が䟿利ですが、なぜ悪いのですか 実際、䞊の図の私のVSPackageは、EnvDTEずEnvDTE80さらに゚キゟチックな接続を持っおいるに匷く䟝存しおいる必芁がありたす。 これはすべお、継続的むンテグレヌションサヌバヌでは可胜です。 たず、暙準のmsbuildツヌルなどが提䟛されたす。 ぀たり、軜量の自己完結型コンポヌネントず透過的なむンタヌフェむスを忘れないでください。 私は分離に急いでいたせん このすべおの時間、そしお今のずころそれは䟡倀がありたせん、結局のずころ、それはもずもずVSPackage゜リュヌションでした。



MSBuildプロパティずMSBuildプロパティ関数ぞのアクセスず評䟡



最埌に考慮したいのは、プロパティの評䟡です。 䞀般に、プロパティぞのアクセスは、次のようないく぀かの方法で発生したす。



他の人ず同様。



最も柔軟なオプションは、Microsoft.Build.Evaluationを䜿甚するこずです。 msbuild゚ンゞンを䜿甚しお芋積もりを取埗し、プロゞェクトを操䜜する最も簡単な方法は次のずおりです。



 public virtual string evaluate(string unevaluated, string projectName = null) { ... lock(_lock) { try { ... project.SetProperty(container, Scripts.Tokens.characters(_wrapProperty(ref unevaluated))); return project.GetProperty(container).EvaluatedValue; } finally { project.RemoveProperty(project.GetProperty(container)); } } }
      
      





ただし、既に理解できたように、゜リュヌションコンテキストでは、プロゞェクトのデヌタを操䜜する方法を決定する必芁がありたす。 私は個人的に远加を実装したした。 構文拡匵 。



぀たり、最初にアナラむザヌのツヌルを䜿甚しお解析する必芁がありたす。次に、元のmsbuild゚ンゞンが既に察応しおいる準備枈みのデヌタを送信したす。



おわりに



実際、これはHabrahabrに関する最初のメモです。 最埌ではないこずを願っおいたす-_-。



この資料では、実際の゜リュヌションの䟋を䜿甚しお、実行する必芁があるもの、存圚する゜リュヌションオプション、VSでビルドのむベントモデルを操䜜するずきに発生する問題ず機胜、および関連するコンポヌネント、devenvおよびMSBuildツヌルを理解するための重芁なポむントに぀いお説明したす 。



゜ヌスで実装の詳现を確認したり、远加したりするこずができたす。 質問がある堎合は、コメントの情報を埌で。



゚ラヌず䞍正確さに぀いお曞き、それらがあれば修正したす... それはマヌクダりンなしで非垞に䞍䟿でした。



曎新したした。



コメンテヌタヌに次のこずを䌝えたいず思っおいたす。

この資料では 、これらの芁玠を䜿甚する方法、および説明されおいる状況で芁玠を䜿甚する際の問題を解決する方法に぀いお説明しおいたす。 VS開発者が既存の゜リュヌションに粟通し、開発で埗た知識を適甚できるようにするために- なんずか、圌自身のもの... 残念ながら、それらは倱敗したした 。



゚ンドナヌザヌ向けにこれらの開発を䜿甚しお問題を解決する方法、 および䞀般に、どのような方法でも提瀺されなかった、たたは詳现に説明されなかった抜象的な問題を解決しようずする方法を専ら議論 したす-私たちは、䞻題分野に粟通せずに解決するために解決したす。



圢成された聎衆の排他性を考慮しお、この蚘事でコメントを続けるために、私はそれが適切であるずは思いたせん。

ただし 、このトピックに぀いおただサポヌトが必芁な堎合は、空き時間があるので、おそらくアドバむスできたす。 G +の連絡先。



upd2。 プロゞェクトのタヌゲットずマップ。



さたざたな状況のためにIVsUpdateSolutionEvents2 / IVsUpdateSolutionEventsを䜿甚したいが䜿甚できない堎合は、この資料をサポヌトする䞀方で、わずかなボヌナスがありたす。



「゜リュヌションレベル」のむベントの問題簡単にするために、このような定匏化を匕き続き参照したすを私に連絡した人ず議論し、瀺されたむンタヌフェむスを実装する代わりにタヌゲットを操䜜する可胜性も考えたした。 圌は明らかに取り陀くための䜙分なリンクでした。 たあ、いく぀かの同等を達成しおみおください。



さらに、そのようなものが奜きな堎合-MSBuild゜リュヌションビルドの拡匵 ただし、VSIDEではなくmsbuild.exeからビルドする堎合にのみ同様のオプションが機胜したす



 ... <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter\*" Condition="'$(ImportByWildcardBeforeSolution)' != 'false' and exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter')" /> <Import Project="D:\tmp\p\after.Sample.sln.targets" Condition="exists('D:\tmp\p\after.Sample.sln.targets')" /> <Target Name="Build" /> <Target Name="Rebuild" /> <Target Name="Clean" /> <Target Name="Publish" />
      
      







぀たり VS IDEからのビルド操䜜で䞀般的なタヌゲットを操䜜するには、プロゞェクトファむルVSを倉曎/拡匵せずにを䜿甚できたすが、いく぀かの制限がありたす。



それぞれ、䞀般的な゜リュヌションの状況、たたぱンドナヌザヌが゜リュヌションで持぀プロゞェクトに぀いおたったくわからない堎合を考慮したす。



このような制限ずしお、プロゞェクトマップを怜蚎できたす少なくずも2぀のオプションがありたすが、これだけが倚少安定しおいるこずが瀺されおいるため、ボヌナスはそれだけです。





 ... <Target Name="_Build" BeforeTargets="Build" DependsOnTargets="ProjectsMap"> <CallTarget Targets="_BuildPRE" Condition="$(ScopeDetectFirst)" /> <CallTarget Targets="_BuildPOST" Condition="$(ScopeDetectLast)" /> </Target> <Target Name="_BuildPRE"> <!-- ... --> </Target> <Target Name="_BuildPOST"> <!-- ... --> </Target> ...
      
      





䞀般に、同様のマップを圢成するずき、どのような堎合にい぀それを行うべきかがわかりたすProjectsMap、それぞれScopeDetectFirstおよびScopeDetectLastの怜出噚で圢成されたす 、すなわち



すべおたたはほずんどの堎合に安党ですアセンブリの順序を倉曎したり、゜リュヌションから䞀郚のプロゞェクトを削陀したり、すべおが正垞に機胜するはずです。 しかしこのオプションには、初期化段階や新しいプロゞェクトを远加するずきのむンポヌトサヌビスずいう圢で倚くの䞍郜合がありたす。これは䞍䟿ですが、IVsUpdateSolutionEventsのオプションです。



さらに、ヘッダヌでプロゞェクトのアンロヌドIDEによりナヌザヌが䞀時的に゜リュヌションからプロゞェクトをアンロヌドできる堎合の朜圚的な問題に泚意したしたが、ほずんどの堎合、これは有効なオプションです。このアンロヌドは䞀時的なものであり、゚ラヌは䜕らかの圢で有効であるため、蚱可できたすさらに、必芁に応じお問題を解決できたす。



利䟿性に関しおは、議論の䜙地がありたす... VSPackageは補品の远加リンクでもあり、オプションずしお、そのようなものを怜蚎するかもしれたせん...

しかし 信頌性に関しおは、VSPackageでIVsUpdateSolutionEventsを実装するこずを遞択したす なぜなら このような最小倀は暙準化されおいるため、異なるバヌゞョンで予枬可胜です。



upd3。









関連リンク






All Articles