Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Initial commit of the VS package

Initial commit of the VS package after playing around with some ideas
for a few hours (spend most time getting .NET Demon build support
working). Added settings dialog to configure command to be executed.
Focus is restored after the command (some test runners like ReSharper
steal the editor window focus away). Also added timeout to wait for next
execution after command has executed. Save and load also implemented and
did some testing.
  • Loading branch information...
commit bb6879109d01fac9eb32e875d745dc1ef8ea5635 1 parent 9cdaa49
@BenjaminNitschke BenjaminNitschke authored
View
94 .gitignore
@@ -3,4 +3,96 @@ bin
obj
# mstest test results
-TestResults
+TestResults
+
+# Ignore Visual Studio files
+*.cachefile
+*.obj
+*.pdb
+*.user
+*.aps
+*.pch
+*.vspscc
+*.ncb
+*.suo
+*.exp
+*.tlb
+*.tlh
+*.bak
+*.cache
+*.ilk
+*.log
+*.lib
+*.sbr
+*.sdf
+*.opensdf
+*.scc
+Debug*/
+obj/
+Release*/
+_ReSharper*/
+BuildLog.*
+*.pidb
+*.userprefs
+*.vs10x
+*.ncrunchsolution
+
+# Disallow all binary and content files
+*.dll
+#allow for tools: *.png
+*.bmp
+*.jpg
+*.jpeg
+*.gif
+#allow for icons: *.ico
+*.tga
+*.tif
+*.dae
+#allow for engine assemblies .xml documentation: *.xml
+*Font.xml
+*.glessl
+*.rgb
+*.rgba
+*.rgba4
+*.dds
+*.psd
+*.max
+*.3ds
+*.mp3
+*.wav
+*.avi
+*.ttf
+*.font
+*.pdf
+*.doc
+*.docx
+*.img
+*.mov
+*.mpg
+*.img
+*.mp4
+*.m4v
+*.wma
+*.wmv
+*.mov
+*.bin
+*.iso
+.svn/
+*.svn
+#allow for vs templates: *.zip
+*.rar
+*.7z
+*.chm
+*.help
+#allow for readme.txt: *.txt
+*.html
+*.htm
+*.orig
+*.css
+*.xslt
+*.swf
+*.JPG
+*.xnb
+*.db
+_UpgradeReport_Files/
+Tools/Settings.xml
View
58 Command.cs
@@ -0,0 +1,58 @@
+using System;
+using System.IO;
+
+namespace DeltaEngine.TestAfterBuild
+{
+ public static class Command
+ {
+ private const string CommandFilename = "TestAfterBuild.Command";
+ private static string userPath;
+ private static string CommandFilePath
+ {
+ get { return Path.Combine(userPath, CommandFilename); }
+ }
+
+ public static string Current = "";
+ public static int WaitTimeInSeconds = 0;
+ public static DateTime LastTimeExecuted = new DateTime(2000, 1, 1);
+
+ public static bool IsDisabled
+ {
+ get
+ {
+ return String.IsNullOrEmpty(Current) ||
+ (DateTime.Now - LastTimeExecuted).TotalSeconds < WaitTimeInSeconds;
+ }
+ }
+
+ public static void Load(string setUserPath)
+ {
+ userPath = setUserPath;
+ if (File.Exists(CommandFilePath))
+ ReadTextFromFile();
+ }
+
+ private static void ReadTextFromFile()
+ {
+ var file = File.OpenText(CommandFilePath);
+ Current = file.ReadLine();
+ WaitTimeInSeconds = 0;
+ int.TryParse(file.ReadLine(), out WaitTimeInSeconds);
+ file.Close();
+ }
+
+ public static void Save()
+ {
+ var file = File.CreateText(CommandFilePath);
+ file.WriteLine(Current);
+ file.WriteLine(WaitTimeInSeconds.ToString());
+ file.Close();
+ }
+
+ public static void DeleteSaveFile()
+ {
+ if (File.Exists(CommandFilePath))
+ File.Delete(CommandFilePath);
+ }
+ }
+}
View
11 GlobalSuppressions.cs
@@ -0,0 +1,11 @@
+// This file is used by Code Analysis to maintain SuppressMessage
+// attributes that are applied to this project. Project-level
+// suppressions either have no target or are given a specific target
+// and scoped to a namespace, type, member, etc.
+//
+// To add a suppression to this file, right-click the message in the
+// Error List, point to "Suppress Message(s)", and click "In Project
+// Suppression File". You do not need to add suppressions to this
+// file manually.
+
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1017:MarkAssembliesWithComVisible")]
View
14 Guids.cs
@@ -0,0 +1,14 @@
+// Guids.cs
+// MUST match guids.h
+using System;
+
+namespace DeltaEngine.TestAfterBuild
+{
+ static class GuidList
+ {
+ public const string guidTestAfterBuildPkgString = "ede6f27f-08b8-426a-948d-9c23965753dd";
+ public const string guidTestAfterBuildCmdSetString = "1daac2f9-c14d-40d0-bd2d-dd431baf15bf";
+
+ public static readonly Guid guidTestAfterBuildCmdSet = new Guid(guidTestAfterBuildCmdSetString);
+ };
+}
View
BIN  Key.snk
Binary file not shown
View
11 PkgCmdID.cs
@@ -0,0 +1,11 @@
+// PkgCmdID.cs
+// MUST match PkgCmdID.h
+using System;
+
+namespace DeltaEngine.TestAfterBuild
+{
+ static class PkgCmdIDList
+ {
+ public const uint cmdidSetupTestsAfterBuilding = 0x100;
+ };
+}
View
36 Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("TestAfterBuild")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Delta Engine")]
+[assembly: AssemblyProduct("TestAfterBuild")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+[assembly: CLSCompliant(false)]
+[assembly: NeutralResourcesLanguage("en-US")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
+[assembly: InternalsVisibleTo("TestAfterBuild_IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100211bb22d512aebf95d8d233be585e8c47b0ea6971d95e29444faa896724d5bc7e32db51a05c6a8f268773f41b3052ee4716bd2f54e73f0525dc3e9a2dc16a0ae8d1287aecc0aed919414bff6fab0ecb75fb2fce6f15d2016d34225d4a403be1276b2d51ecfd6f9d697e1f3e61ed3fc968ed2b8960cd414adec2c96bc56a64f82")]
+[assembly: InternalsVisibleTo("TestAfterBuild_UnitTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100211bb22d512aebf95d8d233be585e8c47b0ea6971d95e29444faa896724d5bc7e32db51a05c6a8f268773f41b3052ee4716bd2f54e73f0525dc3e9a2dc16a0ae8d1287aecc0aed919414bff6fab0ecb75fb2fce6f15d2016d34225d4a403be1276b2d51ecfd6f9d697e1f3e61ed3fc968ed2b8960cd414adec2c96bc56a64f82")]
View
64 Resources.Designer.cs
@@ -0,0 +1,64 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.42
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace DeltaEngine.TestAfterBuild {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DeltaEngine.TestAfterBuild.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ }
+}
View
129 Resources.resx
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ VS SDK Notes: This resx file contains the resources that will be consumed directly by your package.
+ For example, if you chose to create a tool window, there is a resource with ID 'CanNotCreateWindow'. This
+ is used in VsPkg.cs to determine the string to show the user if there is an error when attempting to create
+ the tool window.
+
+ Resources that are accessed directly from your package *by Visual Studio* are stored in the VSPackage.resx
+ file.
+-->
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
View
BIN  Resources/Images.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  Resources/Package.ico
Binary file not shown
View
26 SettingsDialog.xaml
@@ -0,0 +1,26 @@
+<Window x:Class="DeltaEngine.TestAfterBuild.SettingsDialog"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DeltaEngine - TestAfterBuild"
+ Height="200" Width="500">
+ <Grid>
+ <Label Content="Command to run after each successful build" HorizontalAlignment="Left" Margin="10,10,0,0"
+ ToolTip="Note: When using .NET Demon, this is executed after each keypress :)"
+ VerticalAlignment="Top" Grid.ColumnSpan="2" />
+ <ComboBox HorizontalAlignment="Left" Margin="12,34,0,0" VerticalAlignment="Top" Width="462" IsEditable="True"
+ Name="SelectedCommand" />
+ <CheckBox Content="After executing the command wait 60 seconds before executing again" HorizontalAlignment="Left"
+ Margin="10,72,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.225,0.8"
+ Name="UseWaitTime"/>
+ <Label Content="Wait time in seconds:" Margin="25,87,0,0" VerticalAlignment="Top" HorizontalAlignment="Left"
+ Width="128" />
+ <TextBox HorizontalAlignment="Left" Height="23" Margin="158,90,0,0" TextWrapping="Wrap" Text="60"
+ VerticalAlignment="Top" Width="66" Name="WaitTime" TextChanged="WaitTimeChanged" />
+ <Button Content="Disable Resharper TestRunner BuildSetting" HorizontalAlignment="Left" Margin="10,131,0,0"
+ VerticalAlignment="Top" Width="246" RenderTransformOrigin="-0.053,0" Click="DisableResharperBuildSettingsClicked"
+ ToolTip="When we just successfully compiled there is no reason for ReSharper to rebuild everything again. .NET Demon also conflicts with it and it is more safe to set ReSharpers build settings to Never." />
+ <Button Content="Disable" HorizontalAlignment="Left" Margin="308,131,0,0" VerticalAlignment="Top" Width="75"
+ Click="DisableClicked" />
+ <Button Content="Save" HorizontalAlignment="Left" Margin="399,131,0,0" VerticalAlignment="Top" Width="75"
+ Click="SaveClicked" />
+ </Grid>
+</Window>
View
84 SettingsDialog.xaml.cs
@@ -0,0 +1,84 @@
+using System.Windows;
+using EnvDTE80;
+
+namespace DeltaEngine.TestAfterBuild
+{
+ public partial class SettingsDialog
+ {
+ private static readonly string[] CommonCommands = new[]
+ {
+ "ReSharper.ReSharper_UnitTestSession_RepeatPreviousRun",
+ "ReSharper.ReSharper_UnitTest_RunSolution",
+ "ReSharper.ReSharper_UnitTest_RunContext",
+ "ReSharper.ReSharper_UnitTest_RunCurrentSession",
+ "TestDriven.NET.RerunTests",
+ "TestDriven.NET.Client",
+ "TestDriven.NET.RunTests",
+ "Test.RunTestsInClass",
+ "Test.RunTestsInCurrentContext",
+ "Test.RunTestsInNamespace",
+ "TestExplorer.RunNotRunTests",
+ "EditorContextMenus.CodeWindow.RunTests",
+ "NCrunch.RuntestspinnedtoTestsWindow",
+ "NCrunch.RuntestsvisibleinTestsWindow"
+ };
+ private readonly DTE2 dte;
+
+ public SettingsDialog(DTE2 setDte)
+ {
+ dte = setDte;
+ InitializeComponent();
+ SelectedCommand.ItemsSource = CommonCommands;
+ SelectedCommand.Text = Command.Current;
+ UpdateWaitMessage();
+ }
+
+ private void UpdateWaitMessage()
+ {
+ if (Command.WaitTimeInSeconds > 0)
+ SetWaitMessage();
+ else
+ UseWaitTime.IsChecked = false;
+ }
+
+ private void SetWaitMessage()
+ {
+ WaitTime.Text = Command.WaitTimeInSeconds.ToString();
+ UseWaitTime.IsChecked = true;
+ UseWaitTime.Content = "After executing the command wait " + Command.WaitTimeInSeconds +
+ " seconds before executing again";
+ }
+
+ private void SaveClicked(object sender, RoutedEventArgs e)
+ {
+ Command.WaitTimeInSeconds = 0;
+ GetWaitTime();
+ Command.Current = SelectedCommand.Text;
+ Command.Save();
+ Close();
+ }
+
+ private void GetWaitTime()
+ {
+ if (UseWaitTime.IsChecked == true)
+ int.TryParse(WaitTime.Text, out Command.WaitTimeInSeconds);
+ }
+
+ private void DisableClicked(object sender, RoutedEventArgs e)
+ {
+ Command.DeleteSaveFile();
+ Close();
+ }
+
+ private void DisableResharperBuildSettingsClicked(object sender, RoutedEventArgs e)
+ {
+ dte.ExecuteCommand("ReSharper_UnitTestSession_BuildPolicy_Never");
+ }
+
+ private void WaitTimeChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
+ {
+ GetWaitTime();
+ UpdateWaitMessage();
+ }
+ }
+}
View
188 TestAfterBuild.csproj
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+ <PropertyGroup>
+ <MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
+ <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
+ <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+ </PropertyGroup>
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{90F94570-7291-4C10-9C72-18CEFB69679F}</ProjectGuid>
+ <ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>DeltaEngine.TestAfterBuild</RootNamespace>
+ <AssemblyName>TestAfterBuild</AssemblyName>
+ <SignAssembly>True</SignAssembly>
+ <AssemblyOriginatorKeyFile>Key.snk</AssemblyOriginatorKeyFile>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <RunCodeAnalysis>true</RunCodeAnalysis>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="Microsoft.VisualStudio.OLE.Interop" />
+ <Reference Include="Microsoft.VisualStudio.Shell.Interop" />
+ <Reference Include="Microsoft.VisualStudio.Shell.Interop.8.0" />
+ <Reference Include="Microsoft.VisualStudio.Shell.Interop.9.0" />
+ <Reference Include="Microsoft.VisualStudio.Shell.Interop.10.0" />
+ <Reference Include="Microsoft.VisualStudio.Shell.Interop.11.0">
+ <EmbedInteropTypes>true</EmbedInteropTypes>
+ </Reference>
+ <Reference Include="Microsoft.VisualStudio.TextManager.Interop" />
+ <Reference Include="Microsoft.VisualStudio.Shell.11.0" />
+ <Reference Include="Microsoft.VisualStudio.Shell.Immutable.10.0" />
+ <Reference Include="Microsoft.VisualStudio.Shell.Immutable.11.0" />
+ <Reference Include="PresentationCore" />
+ <Reference Include="PresentationFramework" />
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Design" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xaml" />
+ <Reference Include="System.Xml" />
+ <Reference Include="WindowsBase" />
+ </ItemGroup>
+ <ItemGroup>
+ <COMReference Include="EnvDTE">
+ <Guid>{80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2}</Guid>
+ <VersionMajor>8</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>primary</WrapperTool>
+ <Isolated>False</Isolated>
+ <EmbedInteropTypes>False</EmbedInteropTypes>
+ </COMReference>
+ <COMReference Include="EnvDTE100">
+ <Guid>{26AD1324-4B7C-44BC-84F8-B86AED45729F}</Guid>
+ <VersionMajor>10</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>primary</WrapperTool>
+ <Isolated>False</Isolated>
+ <EmbedInteropTypes>False</EmbedInteropTypes>
+ </COMReference>
+ <COMReference Include="EnvDTE80">
+ <Guid>{1A31287A-4D7D-413E-8E32-3B374931BD89}</Guid>
+ <VersionMajor>8</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>primary</WrapperTool>
+ <Isolated>False</Isolated>
+ <EmbedInteropTypes>False</EmbedInteropTypes>
+ </COMReference>
+ <COMReference Include="EnvDTE90">
+ <Guid>{2CE2370E-D744-4936-A090-3FFFE667B0E1}</Guid>
+ <VersionMajor>9</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>primary</WrapperTool>
+ <Isolated>False</Isolated>
+ <EmbedInteropTypes>False</EmbedInteropTypes>
+ </COMReference>
+ <COMReference Include="Microsoft.VisualStudio.CommandBars">
+ <Guid>{1CBA492E-7263-47BB-87FE-639000619B15}</Guid>
+ <VersionMajor>8</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>primary</WrapperTool>
+ <Isolated>False</Isolated>
+ <EmbedInteropTypes>False</EmbedInteropTypes>
+ </COMReference>
+ <COMReference Include="stdole">
+ <Guid>{00020430-0000-0000-C000-000000000046}</Guid>
+ <VersionMajor>2</VersionMajor>
+ <VersionMinor>0</VersionMinor>
+ <Lcid>0</Lcid>
+ <WrapperTool>primary</WrapperTool>
+ <Isolated>False</Isolated>
+ <EmbedInteropTypes>False</EmbedInteropTypes>
+ </COMReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Command.cs" />
+ <Compile Include="SettingsDialog.xaml.cs">
+ <DependentUpon>SettingsDialog.xaml</DependentUpon>
+ </Compile>
+ <Compile Include="Guids.cs" />
+ <Compile Include="Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <Compile Include="GlobalSuppressions.cs" />
+ <Compile Include="TestAfterBuildPackage.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="PkgCmdID.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <EmbeddedResource Include="VSPackage.resx">
+ <MergeWithCTO>true</MergeWithCTO>
+ <ManifestResourceName>VSPackage</ManifestResourceName>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="source.extension.vsixmanifest">
+ <SubType>Designer</SubType>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Key.snk" />
+ </ItemGroup>
+ <ItemGroup>
+ <VSCTCompile Include="TestAfterBuild.vsct">
+ <ResourceName>Menus.ctmenu</ResourceName>
+ <SubType>Designer</SubType>
+ </VSCTCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Resources\Images.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="Resources\Package.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <Page Include="SettingsDialog.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
+ </ItemGroup>
+ <PropertyGroup>
+ <UseCodebase>true</UseCodebase>
+ </PropertyGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <Import Project="$(VSToolsPath)\VSSDK\Microsoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
View
20 TestAfterBuild.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAfterBuild", "TestAfterBuild.csproj", "{90F94570-7291-4C10-9C72-18CEFB69679F}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {90F94570-7291-4C10-9C72-18CEFB69679F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {90F94570-7291-4C10-9C72-18CEFB69679F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {90F94570-7291-4C10-9C72-18CEFB69679F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {90F94570-7291-4C10-9C72-18CEFB69679F}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
View
113 TestAfterBuild.vsct
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <!-- This is the file that defines the actual layout and type of the commands.
+ It is divided in different sections (e.g. command definition, command
+ placement, ...), with each defining a specific set of properties.
+ See the comment before each section for more details about how to
+ use it. -->
+
+ <!-- The VSCT compiler (the tool that translates this file into the binary
+ format that VisualStudio will consume) has the ability to run a preprocessor
+ on the vsct file; this preprocessor is (usually) the C++ preprocessor, so
+ it is possible to define includes and macros with the same syntax used
+ in C++ files. Using this ability of the compiler here, we include some files
+ defining some of the constants that we will use inside the file. -->
+
+ <!--This is the file that defines the IDs for all the commands exposed by VisualStudio. -->
+ <Extern href="stdidcmd.h"/>
+
+ <!--This header contains the command ids for the menus provided by the shell. -->
+ <Extern href="vsshlids.h"/>
+
+
+
+
+ <!--The Commands section is where we the commands, menus and menu groups are defined.
+ This section uses a Guid to identify the package that provides the command defined inside it. -->
+ <Commands package="guidTestAfterBuildPkg">
+ <!-- Inside this section we have different sub-sections: one for the menus, another
+ for the menu groups, one for the buttons (the actual commands), one for the combos
+ and the last one for the bitmaps used. Each element is identified by a command id that
+ is a unique pair of guid and numeric identifier; the guid part of the identifier is usually
+ called "command set" and is used to group different command inside a logically related
+ group; your package should define its own command set in order to avoid collisions
+ with command ids defined by other packages. -->
+
+
+ <!-- In this section you can define new menu groups. A menu group is a container for
+ other menus or buttons (commands); from a visual point of view you can see the
+ group as the part of a menu contained between two lines. The parent of a group
+ must be a menu. -->
+ <Groups>
+
+ <Group guid="guidTestAfterBuildCmdSet" id="MyMenuGroup" priority="0x0600">
+ <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
+ </Group>
+
+
+
+ </Groups>
+
+ <!--Buttons section. -->
+ <!--This section defines the elements the user can interact with, like a menu command or a button
+ or combo box in a toolbar. -->
+ <Buttons>
+ <!--To define a menu group you have to specify its ID, the parent menu and its display priority.
+ The command is visible and enabled by default. If you need to change the visibility, status, etc, you can use
+ the CommandFlag node.
+ You can add more than one CommandFlag node e.g.:
+ <CommandFlag>DefaultInvisible</CommandFlag>
+ <CommandFlag>DynamicVisibility</CommandFlag>
+ If you do not want an image next to your command, remove the Icon node /> -->
+
+ <Button guid="guidTestAfterBuildCmdSet" id="cmdidSetupTestsAfterBuilding" priority="0x0100" type="Button">
+ <Parent guid="guidTestAfterBuildCmdSet" id="MyMenuGroup" />
+ <Icon guid="guidImages" id="bmpPic1" />
+ <Strings>
+ <ButtonText>Setup TestAfterBuild Command</ButtonText>
+ </Strings>
+ </Button>
+ </Buttons>
+
+ <!--The bitmaps section is used to define the bitmaps that are used for the commands.-->
+ <Bitmaps>
+ <!-- The bitmap id is defined in a way that is a little bit different from the others:
+ the declaration starts with a guid for the bitmap strip, then there is the resource id of the
+ bitmap strip containing the bitmaps and then there are the numeric ids of the elements used
+ inside a button definition. An important aspect of this declaration is that the element id
+ must be the actual index (1-based) of the bitmap inside the bitmap strip. -->
+ <Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
+
+ </Bitmaps>
+
+ </Commands>
+
+
+
+
+
+ <Symbols>
+ <!-- This is the package guid. -->
+ <GuidSymbol name="guidTestAfterBuildPkg" value="{ede6f27f-08b8-426a-948d-9c23965753dd}" />
+
+ <!-- This is the guid used to group the menu commands together -->
+ <GuidSymbol name="guidTestAfterBuildCmdSet" value="{1daac2f9-c14d-40d0-bd2d-dd431baf15bf}">
+
+ <IDSymbol name="MyMenuGroup" value="0x1020" />
+ <IDSymbol name="cmdidSetupTestsAfterBuilding" value="0x0100" />
+ </GuidSymbol>
+
+
+
+ <GuidSymbol name="guidImages" value="{2fe75d6f-a603-4c59-a73e-ae8dd7e0e1b4}" >
+ <IDSymbol name="bmpPic1" value="1" />
+ <IDSymbol name="bmpPic2" value="2" />
+ <IDSymbol name="bmpPicSearch" value="3" />
+ <IDSymbol name="bmpPicX" value="4" />
+ <IDSymbol name="bmpPicArrows" value="5" />
+ <IDSymbol name="bmpPicStrikethrough" value="6" />
+ </GuidSymbol>
+ </Symbols>
+
+</CommandTable>
View
110 TestAfterBuildPackage.cs
@@ -0,0 +1,110 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.Design;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using EnvDTE;
+using EnvDTE80;
+using Microsoft.VisualStudio.Shell;
+
+namespace DeltaEngine.TestAfterBuild
+{
+ [PackageRegistration(UseManagedResourcesOnly = true),
+ InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400),
+ ProvideMenuResource("Menus.ctmenu", 1), Guid(GuidList.guidTestAfterBuildPkgString)]
+ public sealed class TestAfterBuildPackage : Package
+ {
+ private DTE2 dte;
+ private bool buildSucceeded;
+
+ protected override void Initialize()
+ {
+ base.Initialize();
+ Command.Load(UserDataPath);
+ InitializeDte();
+ InitializeMenus();
+ AttachToBuildEvents();
+ AttachToDotNetDemonEvents();
+ }
+
+ private void InitializeDte()
+ {
+ dte = (DTE2)GetService(typeof (DTE));
+ }
+
+ private void InitializeMenus()
+ {
+ var mcs = GetService(typeof (IMenuCommandService)) as OleMenuCommandService;
+ if (mcs != null)
+ CreateMenuCommand(mcs, PkgCmdIDList.cmdidSetupTestsAfterBuilding,
+ (sender, args) => new SettingsDialog(dte).ShowDialog());
+ }
+
+ private void CreateMenuCommand(OleMenuCommandService mcs, uint commandId, EventHandler runCode)
+ {
+ var menuCommandId = new CommandID(GuidList.guidTestAfterBuildCmdSet, (int)commandId);
+ mcs.AddCommand(new MenuCommand(runCode, menuCommandId));
+ }
+
+ private void AttachToBuildEvents()
+ {
+ dte.Events.BuildEvents.OnBuildBegin += (scope, action) => buildSucceeded = true;
+ dte.Events.BuildEvents.OnBuildProjConfigDone +=
+ (project, projectConfig, platform, solutionConfig, success) =>
+ {
+ if (success == false)
+ buildSucceeded = false;
+ };
+ dte.Events.BuildEvents.OnBuildDone += BuildEvents_OnBuildDone;
+ }
+
+ private void BuildEvents_OnBuildDone(vsBuildScope scope, vsBuildAction action)
+ {
+ if (action != vsBuildAction.vsBuildActionBuild ||
+ buildSucceeded == false)
+ return;
+
+ OnBuildSucceeded();
+ }
+
+ private void OnBuildSucceeded()
+ {
+ if (Command.IsDisabled)
+ return;
+
+ try
+ {
+ ExecuteCommandButDoNotLoseFocus(Command.Current);
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine("Failed to execute command '" + Command.Current + "': " + ex);
+ }
+ finally
+ {
+ PreventRunningTwice();
+ }
+ }
+
+ private void ExecuteCommandButDoNotLoseFocus(string command)
+ {
+ var storeActiveWindow = dte.ActiveWindow;
+ Command.LastTimeExecuted = DateTime.Now;
+ dte.ExecuteCommand(command);
+ storeActiveWindow.Activate();
+ }
+
+ private void PreventRunningTwice()
+ {
+ buildSucceeded = false;
+ }
+
+ private void AttachToDotNetDemonEvents()
+ {
+ List<Action> buildSucceededHandlers = AppDomain.CurrentDomain.GetData(
+ "RedGate.Neptune.BuildSucceeded") as List<Action> ?? new List<Action>();
+ buildSucceededHandlers.Add(OnBuildSucceeded);
+ AppDomain.CurrentDomain.SetData("RedGate.Neptune.BuildSucceeded", buildSucceededHandlers);
+ }
+ }
+}
View
140 VSPackage.resx
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ VS SDK Notes: This resx file contains the resources that will be consumed from your package by Visual Studio.
+ For example, Visual Studio will attempt to load resource '400' from this resource stream when it needs to
+ load your package's icon. Because Visual Studio will always look in the VSPackage.resources stream first for
+ resources it needs, you should put additional resources that Visual Studio will load directly into this resx
+ file.
+
+ Resources that you would like to access directly from your package in a strong-typed fashion should be stored
+ in Resources.resx or another resx file.
+-->
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="110" xml:space="preserve">
+ <value>TestAfterBuild</value>
+ </data>
+ <data name="112" xml:space="preserve">
+ <value>Automatically runs all any unit test runner (Resharper, TestDriven, NUnit, etc.) after each build. Also makes sense in combination with .NET Demon to provide continuous testing which each keystroke.</value>
+ </data>
+ <data name="400" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>Resources\Package.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+</root>
View
18 source.extension.vsixmanifest
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
+ <Metadata>
+ <Identity Id="ede6f27f-08b8-426a-948d-9c23965753dd" Version="1.0" Language="en-US" Publisher="Delta Engine" />
+ <DisplayName>TestAfterBuild</DisplayName>
+ <Description>Automatically runs all Resharper Session unit tests (or just the last test) after each build. Also makes sense in combination with .NET Demon to provide continuous testing which each keystroke.</Description>
+ </Metadata>
+ <Installation InstalledByMsi="false">
+ <InstallationTarget Id="Microsoft.VisualStudio.Pro" Version="11.0" />
+ </Installation>
+ <Dependencies>
+ <Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="4.5" />
+ <Dependency Id="Microsoft.VisualStudio.MPF.11.0" DisplayName="Visual Studio MPF 11.0" d:Source="Installed" Version="11.0" />
+ </Dependencies>
+ <Assets>
+ <Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
+ </Assets>
+</PackageManifest>
Please sign in to comment.
Something went wrong with that request. Please try again.