-
Notifications
You must be signed in to change notification settings - Fork 2
/
OpenBinFolderPackage.cs
93 lines (76 loc) · 3.72 KB
/
OpenBinFolderPackage.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using EnvDTE;
using EnvDTE80;
using Microsoft;
using Microsoft.VisualStudio.Shell;
using System;
using System.ComponentModel.Design;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
namespace OpenBinFolderVs2022
{
/// <summary>
/// This is the class that implements the package exposed by this assembly.
/// </summary>
/// <remarks>
/// <para>
/// The minimum requirement for a class to be considered a valid package for Visual Studio
/// is to implement the IVsPackage interface and register itself with the shell.
/// This package uses the helper classes defined inside the Managed Package Framework (MPF)
/// to do it: it derives from the Package class that provides the implementation of the
/// IVsPackage interface and uses the registration attributes defined in the framework to
/// register itself and its components with the shell. These attributes tell the pkgdef creation
/// utility what data to put into .pkgdef file.
/// </para>
/// <para>
/// To get loaded into VS, the package must be referred by <Asset Type="Microsoft.VisualStudio.VsPackage" ...> in .vsixmanifest file.
/// </para>
/// </remarks>
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] // Info on this package for Help/About
[Guid(PackageGuids.PackageGuidString)]
[ProvideMenuResource("Menus.ctmenu", 1)]
public sealed class OpenBinFolderPackage : AsyncPackage
{
/// <summary>
/// OpenBinFolderVs2022Package GUID string.
/// </summary>
public static DTE2 _dte;
#region Package Members
protected async override System.Threading.Tasks.Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
// When initialized asynchronously, the current thread may be a background thread at this point.
// Do any initialization that requires the UI thread after switching to the UI thread.
await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
_dte = await GetServiceAsync(typeof(DTE)) as DTE2;
Assumes.Present(_dte);
if (await GetServiceAsync(typeof(IMenuCommandService)) is OleMenuCommandService mcs)
{
CommandID menuCommandID = new CommandID(PackageGuids.OpenBinFolderCommandSetGuid, PackageIds.CmdOpenBinFolder);
OleMenuCommand menuItem = new OleMenuCommand(OpenBinFolderWithFileExplorer, menuCommandID);
mcs.AddCommand(menuItem);
}
}
#endregion
private void OpenBinFolderWithFileExplorer(object sender, EventArgs e)
{
ThreadHelper.ThrowIfNotOnUIThread();
// Find active projects
var activeProjects = (Array)_dte.ActiveSolutionProjects;
foreach (var (currentProjectPath, currentProjectBinPath) in
from Project activeProject in activeProjects
let currentProjectPath = Path.GetDirectoryName(activeProject.FullName)
let currentProjectOutputPath = activeProject.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString()
let currentProjectBinPath = Path.Combine(currentProjectPath, currentProjectOutputPath)
select (currentProjectPath, currentProjectBinPath))
{
if (Directory.Exists(currentProjectBinPath))
System.Diagnostics.Process.Start(currentProjectBinPath);
else
System.Diagnostics.Process.Start(currentProjectPath);
}
}
}
}