-
-
Notifications
You must be signed in to change notification settings - Fork 200
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Associate .binlog and .buildlog files with the MSBuild Structured Log…
… Viewer. Fixes #64
- Loading branch information
1 parent
ca71cd2
commit 93e28a5
Showing
3 changed files
with
87 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
using System; | ||
using System.Diagnostics; | ||
using Microsoft.Win32; | ||
|
||
namespace StructuredLogViewer | ||
{ | ||
public class FileAssociation | ||
{ | ||
public string Extension { get; set; } | ||
public string ProgId { get; set; } | ||
public string FileTypeDescription { get; set; } | ||
public string ExecutableFilePath { get; set; } | ||
} | ||
|
||
public class FileAssociations | ||
{ | ||
// needed so that Explorer windows get refreshed after the registry is updated | ||
[System.Runtime.InteropServices.DllImport("Shell32.dll")] | ||
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2); | ||
|
||
private const int SHCNE_ASSOCCHANGED = 0x8000000; | ||
private const int SHCNF_FLUSH = 0x1000; | ||
|
||
public static void EnsureAssociationsSet() | ||
{ | ||
var filePath = Process.GetCurrentProcess().MainModule.FileName; | ||
EnsureAssociationsSet( | ||
new FileAssociation | ||
{ | ||
Extension = ".binlog", | ||
ProgId = "MSBuildBinaryLog", | ||
FileTypeDescription = "MSBuild Binary Log", | ||
ExecutableFilePath = filePath | ||
}, | ||
new FileAssociation | ||
{ | ||
Extension = ".buildlog", | ||
ProgId = "MSBuildStructuredLog", | ||
FileTypeDescription = "MSBuild Structured Log", | ||
ExecutableFilePath = filePath | ||
}); | ||
} | ||
|
||
public static void EnsureAssociationsSet(params FileAssociation[] associations) | ||
{ | ||
bool madeChanges = false; | ||
foreach (var association in associations) | ||
{ | ||
madeChanges |= SetAssociation( | ||
association.Extension, | ||
association.ProgId, | ||
association.FileTypeDescription, | ||
association.ExecutableFilePath); | ||
} | ||
|
||
if (madeChanges) | ||
{ | ||
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero); | ||
} | ||
} | ||
|
||
public static bool SetAssociation(string extension, string progId, string fileTypeDescription, string applicationFilePath) | ||
{ | ||
bool madeChanges = false; | ||
madeChanges |= SetKeyDefaultValue(@"Software\Classes\" + extension, progId); | ||
madeChanges |= SetKeyDefaultValue(@"Software\Classes\" + progId, fileTypeDescription); | ||
madeChanges |= SetKeyDefaultValue($@"Software\Classes\{progId}\shell\open\command", "\"" + applicationFilePath + "\" \"%1\""); | ||
return madeChanges; | ||
} | ||
|
||
private static bool SetKeyDefaultValue(string keyPath, string value) | ||
{ | ||
using (var key = Registry.CurrentUser.CreateSubKey(keyPath)) | ||
{ | ||
if (key.GetValue(null) as string != value) | ||
{ | ||
key.SetValue(null, value); | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters