- MS Visual Studioã®ãããžã§ã¯ããšãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããã€ãã³ãã¢ãã«ãç解ããã
- VSPackageã®devenv.exeã¢ãŒãã®ã³ãã³ãã©ã€ã³ãµããŒããååŸããæ¹æ³ãç解ããŸãïŒå ã æäŸãããŠããªãã£ãå ŽåïŒã
- MSBuildããŒã«ããåæ§ã®ã€ãã³ãã¢ãã«ããšãã¥ã¬ãŒãããã¡ã€ã³ãã©ã°ã€ã³ã«ãããŒããã£ã¹ãããæ¹æ³ãç解ããŸãã
- åªå ãµãã¹ã¯ãªãã·ã§ã³ã§äœæ¥ããæ¹æ³ãåŠã³ãŸãã
- Visual Studio / MSBuild Toolsã§ã€ãã³ããåŠçãããšãã«æ§ç¯ã³ã³ããã¹ããååŸããããã®ãªãã·ã§ã³ãèŠã€ããŸãã
- MSBuildããããã£ãšMSBuildããããã£é¢æ°ã®è©äŸ¡ã«ã€ããŠåŠç¿ããŸãã
- ç°çš®ã·ã¹ãã ã³ã³ããŒãã³ãã®æœè±¡åã¬ã€ã€ãŒã§ã¢ãžã¥ãŒã«éçžäºäœçšã«é¢ããäžè¬æ å ±ãååŸããŸãã
ãããã
å€ãã®å Žåãç¹å®ã®ããã»ã¹ã®èªååã«å¯ŸåŠããå¿ èŠãããããããœãªã¥ãŒã·ã§ã³ã®äžéšãé ããæ©ãã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
[ïŒ]
ããã...
- ãœãªã¥ãŒã·ã§ã³ã«ã¯ãã€ãã³ãããããŒããã£ã¹ãããããã®ã¢ãã€ã³ã©ãããŒã®äœ¿çšãå«ãŸããŸãã
- ã³ãã³ãã©ã€ã³ã¢ãŒããæäŸããã®ã¯ã¢ãã€ã³ã§ãããŸãã¯ãVSã¯ãã®ã¢ãŒãã§åäœããæºåãã§ããŠããŸãã
- ãããã¯ãŸã£ããåãã¢ãã«ã§ãããããVSPackageã«ã€ããŠã¯ãå€ãè¯ãIVsUpdateSolutionEvents2ãå®è£ ããããæç¹ã§ç»é²ããã ãã®ç°¡åãªæ¹æ³ã¯ãããŸããã
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) { ... } }
ãã ããç¥ã£ãŠããå¿ èŠãããæ©èœãããã€ããããŸãã
- IEventSource.BuildStartedã¯åäœããŸããïŒä»¥äžã®æ³šãåç §ïŒ ããã«æ©èœããããåŠçããå¿ èŠããããããžã§ã¯ãã®ããŒã¿ãååŸããããã«ãåŸ æ©ããå¿ èŠããããŸãã VSã§ã¯-ãã°ã€ã³ã³ã³ããã¹ãã¯IVsSolutionEventsã§åŠçãããŸãã
- ãããã£ãŠãPREã€ãã³ãã«IEventSource.ProjectStartedã䜿çšããããšã¯å¯èœã§ãããŸãããããžã§ã¯ãã¬ãã«ã®ã€ãã³ãã«äœ¿çšããå¿ èŠããããŸãã
å®éã«ã¯ããã³ãã©ãŒ-ProjectStartedEventHandlerã¯åŒæ°ãšããŠProjectStartedEventArgsãéä¿¡ããŸããããšãã°ã次ã®ããã«ã .slnãã¡ã€ã«ã远跡ããŠåŠçããããšãã§ããŸãã
evt.ProjectStarted += (object sender, ProjectStartedEventArgs e) { e.ProjectFile; // should be .sln ! ... };
ãã®ãªãã·ã§ã³ã¯ãåŠçã®ããã«.slnãåãåããŸã§åŸ æ©ããŠããå¯èœæ§ãããããããžã§ã¯ããã¡ã€ã«ãééããåã§ãªããã°ãªããŸããã
ããã«å¯ŸããèŠçã¯å§ãŸã£ãã°ããã§ãããªããªã æ¬æ Œçãªäœæ¥ã«ã¯ãããšãã°ãæ°ããmsbuildããããã£ã®è©äŸ¡ããã«ãã®äžæãªã©ãmsbuildãšã³ãžã³ã«ã¢ã¯ã»ã¹ããããã®ãããžã§ã¯ãã®èªã¿èŸŒã¿ãªã©ã.slnããŒã¿ãå¿ èŠã«ãªããŸãã
æ®å¿µãªããã.slnãã¡ã€ã«ãæäœããã«ã¯ãéåžžã®ãã®ã¯è¡šç€ºãããŸãããããæ£ç¢ºã«ã¯ã奜ã¿ã«åãããŠéžæããŸãã
- ãŸãã¯ãå€ããã®ã䜿çšããŸã å»æ¢ãããMicrosoft.Build.BuildEngine.ProjectãšããŠããŒã¯ãã ãŸã ã åæã«ãMicrosoft.Build.BuildEngineã䜿çšããŠããªãå Žåã¯ããããè¿œå ãããããšãèæ ®ããŠãã ããã ãããžã§ã¯ãã®äžèŠãªåç §ã
- ãŸãã¯ãå
éšã¡ãœãã-Microsoft.Buildã§ãªãã¬ã¯ã·ã§ã³ã䜿çšããŸãã BuildEngine.Shared ãããšãã°ïŒ
-> void ParseProjectïŒstring firstLineïŒ
-> void ParseFirstProjectLineïŒstring firstLineãProjectInSolution projïŒ
-> crackProjectLine-> PROJECTNAME + RELATIVEPATH - ãŸãã¯ãåãParseProjectã®äŸã«åŸã£ãŠãç¬èªã®å°ããªããŒãµãŒãäœæããŸãã
éžæè¢ã¯è±å¯ã§ã¯ãããŸãããã.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ã䜿çšããæ¹ãè¯ãã§ãããããŒãžã§ã³äºææ§ãšåªå åŠçãç¶æããããã®å¯äžã®æå¹ãªãªãã·ã§ã³ã§ãã ãããŠã誰ãä»ã®æ±ºå®ãåã°ããããšããŸããã
ã¢ãžã¥ãŒã«éçžäºäœçš
ããŠãããã§ã¯ãå®éãç®ç«ã£ããã®ã¯äœããããŸããããã¹ãŠã¯å¹³å¡ã§ãããèšäºã®æ çµã¿ã®äžã«ã¯å°ããªèª¬æããããŸãã
æ¢ã«ãæ°ã¥ãã®ããã«ãã³ã³ããŒãã³ãã¯çšéãåºããã€ãã³ãåŠçã¢ãã«ãç°ãªããŸãã ãã©ã°ã€ã³ãäŸãšããŠäœ¿çšãããšã次ã®ããã«ãªããŸãã
![ç»å](https://habrastorage.org/files/b83/75f/e41/b8375fe413634b1ca40a8a52355051d7.png)
衚瀺ãããŠãããã®ã®ã·ãŒãã¯ããã«ãããŸã ã
ä»äºã®ãã€ã©ã€ãïŒ
- ãã¹ãŠã®å¿ èŠãªã³ã³ããŒãã³ããå®è£ ã§ããããã«ããããžã§ã¯ãã¬ãã«ã§å ±éã®ãããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ãéžæããŸãã ããã¯Shell.Interopãè¡ãããšã§ãããEnvDTEãªã©ãåæ§ã§ãã
- ããã°ã©ã ã®ã¡ã€ã³ã³ã¢ã®å Žæã決å®ããŸãã çµ±åããŒã¿åŠçãæ åœãã人ã
- ã©ã€ãã©ãªããŒããŒã¯ã©ããã§å®çŸ©ããŸãã å€éšãããã€ããŒãªã©ã®ããã«ããããšãã§ããŸãã
- åã³ã³ããŒãã³ãã¯ãããããç¬ç«ããŠã䜿çšãããå Žæãžã®æ¥ç¶æ¹æ³ã決å®ããäžè¬ã«ãå¿ èŠã«å¿ããŠãåŠçãããããŒã¿ã®è»¢éãšå€æã®ã¿ãåŠçããå¿ èŠããããŸãã ïŒå€éšã©ã€ãã©ãªã®æäœæ¹æ³ã®äŸã瀺ãå¿ èŠã¯ãªããšæããŸããç§ã®ãœãŒã¹ãŸãã¯äžè¬çã«ã©ãã§ãèŠã€ããããšãã§ããŸãããããã¯èšäºã®ç¯å²å€ã§ãïŒã
ããã«ã¯éèŠãªãã€ã³ãããããŸãã ç§ãã¡ã®ãã©ã°ã€ã³ã¯ããšããšãã®ãããªããªã¥ãŒã ã§äœ¿çšãããããšãæå³ããŠããªãã£ããããã·ã¹ãã ã®ã³ã¢ã¯VSPackageã«ãããŸãã
ã¯ããåå¥ã®ã³ã³ããŒãã³ãã«åå²ããªãæ¹ã䟿å©ã§ããããªãæªãã®ã§ããïŒ å®éãäžã®å³ã®ç§ã®VSPackageã¯ãEnvDTEãšEnvDTE80ïŒããã«ãšããŸããã¯ãªæ¥ç¶ãæã£ãŠããïŒã«åŒ·ãäŸåããŠããå¿ èŠããããŸãã ããã¯ãã¹ãŠãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãµãŒããŒã§ã¯å¯èœã§ãã ãŸããæšæºã®msbuildããŒã«ãªã©ãæäŸãããŸãã ã€ãŸãã軜éã®èªå·±å®çµåã³ã³ããŒãã³ããšééçãªã€ã³ã¿ãŒãã§ã€ã¹ãå¿ããªãã§ãã ããã ç§ã¯åé¢ã«æ¥ãã§ããŸãã ãã®ãã¹ãŠã®æéããããŠä»ã®ãšããããã¯äŸ¡å€ããããŸãããçµå±ã®ãšãããããã¯ããšããšVSPackageãœãªã¥ãŒã·ã§ã³ã§ããã
MSBuildããããã£ãšMSBuildããããã£é¢æ°ãžã®ã¢ã¯ã»ã¹ãšè©äŸ¡
æåŸã«èæ ®ãããã®ã¯ãããããã£ã®è©äŸ¡ã§ãã äžè¬ã«ãããããã£ãžã®ã¢ã¯ã»ã¹ã¯ã次ã®ãããªããã€ãã®æ¹æ³ã§çºçããŸãã
- Microsoft.Build.BuildEngineãã
- ãŸãã¯Microsoft.Build.Evaluationã䜿çš
ä»ã®äººãšåæ§ã
æãæè»ãªãªãã·ã§ã³ã¯ã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ãããã«ãããå Žåã«ã®ã¿åæ§ã®ãªãã·ã§ã³ãæ©èœããŸãïŒ
- VS IDEã¯ããã«ãæã«.slnãã¡ã€ã«ããŸã£ããèæ ®ããŸããã 圌女ã¯ãå¿ããç°å¢ããEnvDTEãªã©ã§æçµç®æšãèšå®ããŸãã
- .slnãã¡ã€ã«ã¯msbuild.exeã«ãã£ãŠã®ã¿èæ ®ãããŸã-ã€ãŸã ãã«ãããåã«ã.metaprojïŒããã©ã«ãã§ã¡ã¢ãªå ïŒãèªåçã«çæãããŸããããã«ã¯ããã¹ãŠã®ãããžã§ã¯ãã®å ±éã®ã¿ãŒã²ããïŒååšããå ŽåïŒãå«ãããã«ãã®å¯Ÿè±¡ãšææãå«ãŸããŸãã äŸïŒ
... <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" />
- ãã®å Žåã.metaprojã¯VS IDEãšã¯èŠãªãããŸããã 圌ã¯ãã§ã«ç¬èªã®ç®æšãèšå®ããŠããŸãã
- ãŸããäœããã€äœãèµ·ããã®ãããŸã£ããããããŸããã ãããžã§ã¯ãã¯ãäºåã«å®çŸ©ãããVSç®æšã䜿çšããŠåå¥ã«æ§ç¯ãããŸãã
ã€ãŸã 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ã®æ€åºåšã§åœ¢æãããŸãïŒ ãããªãã¡ïŒ
- ããšãã°ã次ã®ããã«ããã¹ãŠã®ãããžã§ã¯ãã«å
±éã®.targetsãã¡ã€ã«ãèªåçã«è¿œå ããŸãïŒããšãã°ã NuGetã€ãã³ããªã©ã䜿çšïŒã
<Import Project="..\<SolutionFile>.targets" />
- ããã«ããããžã§ã¯ããããã®åœ¢åŒã®å¶éã«ããã次ã®å®è¡ïŒã¯ãªãŒã³ããã«ãããªãã«ããªã©ã®ç®æšïŒãéæã§ããŸãã
- ãæåã®ãããžã§ã¯ãã®åã
- ãæåŸã®ãããžã§ã¯ãã®çµäºåŸã
ãã¹ãŠãŸãã¯ã»ãšãã©ã®å Žåã«å®å šã§ãïŒã¢ã»ã³ããªã®é åºãå€æŽãããããœãªã¥ãŒã·ã§ã³ããäžéšã®ãããžã§ã¯ããåé€ãããããã¹ãŠãæ£åžžã«æ©èœããã¯ãã§ãïŒã ãããïŒãã®ãªãã·ã§ã³ã«ã¯ãåæå段éãæ°ãããããžã§ã¯ããè¿œå ãããšãã®ã€ã³ããŒããµãŒãã¹ãšãã圢ã§å€ãã®äžéœåããããŸããããã¯äžäŸ¿ã§ãããIVsUpdateSolutionEventsã®ãªãã·ã§ã³ã§ãã
ããã«ãããããŒã§ãããžã§ã¯ãã®ã¢ã³ããŒãïŒIDEã«ãããŠãŒã¶ãŒãäžæçã«ãœãªã¥ãŒã·ã§ã³ãããããžã§ã¯ããã¢ã³ããŒãã§ããå ŽåïŒã®æœåšçãªåé¡ã«æ³šæããŸããããã»ãšãã©ã®å Žåãããã¯æå¹ãªãªãã·ã§ã³ã§ãããã®ã¢ã³ããŒãã¯äžæçãªãã®ã§ããããšã©ãŒã¯äœããã®åœ¢ã§æå¹ã§ãããããèš±å¯ã§ããŸãïŒããã«ãå¿ èŠã«å¿ããŠåé¡ã解決ã§ããŸãïŒã
å©äŸ¿æ§ã«é¢ããŠã¯ãè°è«ã®äœå°ããããŸã... VSPackageã¯è£œåã®è¿œå ãªã³ã¯ã§ãããããªãã·ã§ã³ãšããŠããã®ãããªãã®ãæ€èšãããããããŸãã...
ããã ä¿¡é Œæ§ã«é¢ããŠã¯ãVSPackageã§IVsUpdateSolutionEventsãå®è£ ããããšãéžæããŸãïŒ ãªããªã ãã®ãããªæå°å€ã¯æšæºåãããŠãããããç°ãªãããŒãžã§ã³ã§äºæž¬å¯èœã§ãã
upd3ã
- ãã«ãã¹ã¬ããããã³ã¢ã»ã³ããªããã»ã¹ã«ä»å ¥ããæ©èœã«åãããŠèª¿æŽãããmsbuildã€ãã³ãã«é¢ããå°ããªã¡ã¢ãCSCãšã©ãŒïŒCS2001ïŒãšã©ãŒã®äŸãäžãèŠã
- 宎äŒã®ç¶ç¶ãæ¬æ ŒçãªMSBuildãã©ã°ã€ã³ã®éçºã«é¢ãã詳现ãªéšåããã ããæãããªçç±ã«ãããããã§ã¯å
¬éããŸããã§ãããããã§CodeProjectãèªãã§ãã ãããããªããåŠã³ãŸãïŒ
- äºåã«äœãç¥ãããŠããªããããžã§ã¯ãã決å®ã«å¯Ÿå¿ããèœå+æè»ãªçžäºäœçšã
- MSBuild Tool , ..
- , EnvDTE.CommandEvents , . SO .
é¢é£ãªã³ã¯
- VSPackage â visualstudiogallery.msdn.microsoft.com/0d1dbfd7-ed8a-40af-ae39-281bfeca2334
- Github: github.com/3F/vsSolutionBuildEvent
- Visual Studio: Solution-wide pre-build event? â stackoverflow.com/q/2295454
- Map of projects â gist.github.com/3F/a77129e3978841241927
- Current type of the build action from Visual Studio â Microsoft.VisualStudio.Shell.Interop â stackoverflow.com/a/27081247
- IVsUpdateSolutionEvents2 â msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsupdatesolutionevents2.aspx
- IVsUpdateSolutionEvents4 â msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsupdatesolutionevents4.aspx
- Microsoft.VisualStudio.Shell.Interop â msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.Shell.Interop.aspx
- Microsoft.Build.Evaluation msdn.microsoft.com/en-us/library/microsoft.build.evaluation
- EnvDTE msdn.microsoft.com/en-us/library/envdte.aspx
- MSBuild: Extending the solution build â sedodream.com/2010/10/22/MSBuildExtendingTheSolutionBuild.aspx
- VSPackages â msdn.microsoft.com/en-us/library/bb166424.aspx
- MS Connect Issue #1075033 â connect.microsoft.com/VisualStudio/Feedback/Details/1075033
- MSBuild Plugin: www.codeproject.com/Articles/1092265/MSBuild-Plugin-The-managing-of-most-processes-at-r