Initial work on an automated VSIX testing tool.  Not working or tested yet.

FossilOrigin-Name: 496e4ac984b2548dd5f2f969cd34656b586cfcfe
diff --git a/vsixtest/App.xaml b/vsixtest/App.xaml
new file mode 100644
index 0000000..7f023fe
--- /dev/null
+++ b/vsixtest/App.xaml
@@ -0,0 +1,8 @@
+<Application

+    x:Class="vsixtest.App"

+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

+    xmlns:local="using:vsixtest"

+    RequestedTheme="Light">

+

+</Application>

diff --git a/vsixtest/App.xaml.cpp b/vsixtest/App.xaml.cpp
new file mode 100644
index 0000000..5d60058
--- /dev/null
+++ b/vsixtest/App.xaml.cpp
@@ -0,0 +1,120 @@
+//

+// App.xaml.cpp

+// Implementation of the App class.

+//

+

+#include "pch.h"

+#include "MainPage.xaml.h"

+

+using namespace vsixtest;

+

+using namespace Platform;

+using namespace Windows::ApplicationModel;

+using namespace Windows::ApplicationModel::Activation;

+using namespace Windows::Foundation;

+using namespace Windows::Foundation::Collections;

+using namespace Windows::UI::Xaml;

+using namespace Windows::UI::Xaml::Controls;

+using namespace Windows::UI::Xaml::Controls::Primitives;

+using namespace Windows::UI::Xaml::Data;

+using namespace Windows::UI::Xaml::Input;

+using namespace Windows::UI::Xaml::Interop;

+using namespace Windows::UI::Xaml::Media;

+using namespace Windows::UI::Xaml::Navigation;

+

+/// <summary>

+/// Initializes the singleton application object.  This is the first line of authored code

+/// executed, and as such is the logical equivalent of main() or WinMain().

+/// </summary>

+App::App()

+{

+	InitializeComponent();

+	Suspending += ref new SuspendingEventHandler(this, &App::OnSuspending);

+}

+

+/// <summary>

+/// Invoked when the application is launched normally by the end user.	Other entry points

+/// will be used such as when the application is launched to open a specific file.

+/// </summary>

+/// <param name="e">Details about the launch request and process.</param>

+void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ e)

+{

+

+#if _DEBUG

+		// Show graphics profiling information while debugging.

+		if (IsDebuggerPresent())

+		{

+			// Display the current frame rate counters

+			 DebugSettings->EnableFrameRateCounter = true;

+		}

+#endif

+

+	auto rootFrame = dynamic_cast<Frame^>(Window::Current->Content);

+

+	// Do not repeat app initialization when the Window already has content,

+	// just ensure that the window is active

+	if (rootFrame == nullptr)

+	{

+		// Create a Frame to act as the navigation context and associate it with

+		// a SuspensionManager key

+		rootFrame = ref new Frame();

+

+		rootFrame->NavigationFailed += ref new Windows::UI::Xaml::Navigation::NavigationFailedEventHandler(this, &App::OnNavigationFailed);

+

+		if (e->PreviousExecutionState == ApplicationExecutionState::Terminated)

+		{

+			// TODO: Restore the saved session state only when appropriate, scheduling the

+			// final launch steps after the restore is complete

+

+		}

+

+		if (rootFrame->Content == nullptr)

+		{

+			// When the navigation stack isn't restored navigate to the first page,

+			// configuring the new page by passing required information as a navigation

+			// parameter

+			rootFrame->Navigate(TypeName(MainPage::typeid), e->Arguments);

+		}

+		// Place the frame in the current Window

+		Window::Current->Content = rootFrame;

+		// Ensure the current window is active

+		Window::Current->Activate();

+	}

+	else

+	{

+		if (rootFrame->Content == nullptr)

+		{

+			// When the navigation stack isn't restored navigate to the first page,

+			// configuring the new page by passing required information as a navigation

+			// parameter

+			rootFrame->Navigate(TypeName(MainPage::typeid), e->Arguments);

+		}

+		// Ensure the current window is active

+		Window::Current->Activate();

+	}

+}

+

+/// <summary>

+/// Invoked when application execution is being suspended.	Application state is saved

+/// without knowing whether the application will be terminated or resumed with the contents

+/// of memory still intact.

+/// </summary>

+/// <param name="sender">The source of the suspend request.</param>

+/// <param name="e">Details about the suspend request.</param>

+void App::OnSuspending(Object^ sender, SuspendingEventArgs^ e)

+{

+	(void) sender;	// Unused parameter

+	(void) e;	// Unused parameter

+

+	//TODO: Save application state and stop any background activity

+}

+

+/// <summary>

+/// Invoked when Navigation to a certain page fails

+/// </summary>

+/// <param name="sender">The Frame which failed navigation</param>

+/// <param name="e">Details about the navigation failure</param>

+void App::OnNavigationFailed(Platform::Object ^sender, Windows::UI::Xaml::Navigation::NavigationFailedEventArgs ^e)

+{

+	throw ref new FailureException("Failed to load Page " + e->SourcePageType.Name);

+}
\ No newline at end of file
diff --git a/vsixtest/App.xaml.h b/vsixtest/App.xaml.h
new file mode 100644
index 0000000..7322d11
--- /dev/null
+++ b/vsixtest/App.xaml.h
@@ -0,0 +1,27 @@
+//

+// App.xaml.h

+// Declaration of the App class.

+//

+

+#pragma once

+

+#include "App.g.h"

+

+namespace vsixtest

+{

+	/// <summary>

+	/// Provides application-specific behavior to supplement the default Application class.

+	/// </summary>

+	ref class App sealed

+	{

+	protected:

+		virtual void OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ e) override;

+

+	internal:

+		App();

+

+	private:

+		void OnSuspending(Platform::Object^ sender, Windows::ApplicationModel::SuspendingEventArgs^ e);

+		void OnNavigationFailed(Platform::Object ^sender, Windows::UI::Xaml::Navigation::NavigationFailedEventArgs ^e);

+	};

+}

diff --git a/vsixtest/Assets/LockScreenLogo.scale-200.png b/vsixtest/Assets/LockScreenLogo.scale-200.png
new file mode 100644
index 0000000..735f57a
--- /dev/null
+++ b/vsixtest/Assets/LockScreenLogo.scale-200.png
Binary files differ
diff --git a/vsixtest/Assets/SplashScreen.scale-200.png b/vsixtest/Assets/SplashScreen.scale-200.png
new file mode 100644
index 0000000..023e7f1
--- /dev/null
+++ b/vsixtest/Assets/SplashScreen.scale-200.png
Binary files differ
diff --git a/vsixtest/Assets/Square150x150Logo.scale-200.png b/vsixtest/Assets/Square150x150Logo.scale-200.png
new file mode 100644
index 0000000..af49fec
--- /dev/null
+++ b/vsixtest/Assets/Square150x150Logo.scale-200.png
Binary files differ
diff --git a/vsixtest/Assets/Square44x44Logo.scale-200.png b/vsixtest/Assets/Square44x44Logo.scale-200.png
new file mode 100644
index 0000000..ce342a2
--- /dev/null
+++ b/vsixtest/Assets/Square44x44Logo.scale-200.png
Binary files differ
diff --git a/vsixtest/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/vsixtest/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644
index 0000000..f6c02ce
--- /dev/null
+++ b/vsixtest/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
Binary files differ
diff --git a/vsixtest/Assets/StoreLogo.png b/vsixtest/Assets/StoreLogo.png
new file mode 100644
index 0000000..7385b56
--- /dev/null
+++ b/vsixtest/Assets/StoreLogo.png
Binary files differ
diff --git a/vsixtest/Assets/Wide310x150Logo.scale-200.png b/vsixtest/Assets/Wide310x150Logo.scale-200.png
new file mode 100644
index 0000000..288995b
--- /dev/null
+++ b/vsixtest/Assets/Wide310x150Logo.scale-200.png
Binary files differ
diff --git a/vsixtest/MainPage.xaml b/vsixtest/MainPage.xaml
new file mode 100644
index 0000000..7672454
--- /dev/null
+++ b/vsixtest/MainPage.xaml
@@ -0,0 +1,13 @@
+<Page

+    x:Class="vsixtest.MainPage"

+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

+    xmlns:local="using:vsixtest"

+    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

+    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

+    mc:Ignorable="d">

+

+    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

+

+    </Grid>

+</Page>

diff --git a/vsixtest/MainPage.xaml.cpp b/vsixtest/MainPage.xaml.cpp
new file mode 100644
index 0000000..f615f4d
--- /dev/null
+++ b/vsixtest/MainPage.xaml.cpp
@@ -0,0 +1,27 @@
+//

+// MainPage.xaml.cpp

+// Implementation of the MainPage class.

+//

+

+#include "pch.h"

+#include "MainPage.xaml.h"

+

+using namespace vsixtest;

+

+using namespace Platform;

+using namespace Windows::Foundation;

+using namespace Windows::Foundation::Collections;

+using namespace Windows::UI::Xaml;

+using namespace Windows::UI::Xaml::Controls;

+using namespace Windows::UI::Xaml::Controls::Primitives;

+using namespace Windows::UI::Xaml::Data;

+using namespace Windows::UI::Xaml::Input;

+using namespace Windows::UI::Xaml::Media;

+using namespace Windows::UI::Xaml::Navigation;

+

+// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

+

+MainPage::MainPage()

+{

+	InitializeComponent();

+}

diff --git a/vsixtest/MainPage.xaml.h b/vsixtest/MainPage.xaml.h
new file mode 100644
index 0000000..cf95007
--- /dev/null
+++ b/vsixtest/MainPage.xaml.h
@@ -0,0 +1,21 @@
+//

+// MainPage.xaml.h

+// Declaration of the MainPage class.

+//

+

+#pragma once

+

+#include "MainPage.g.h"

+

+namespace vsixtest

+{

+	/// <summary>

+	/// An empty page that can be used on its own or navigated to within a Frame.

+	/// </summary>

+	public ref class MainPage sealed

+	{

+	public:

+		MainPage();

+

+	};

+}

diff --git a/vsixtest/Package.appxmanifest b/vsixtest/Package.appxmanifest
new file mode 100644
index 0000000..49e45cb
--- /dev/null
+++ b/vsixtest/Package.appxmanifest
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>

+

+<Package

+  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"

+  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"

+  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"

+  IgnorableNamespaces="uap mp">

+

+  <Identity

+    Name="bb52b3e1-5c8a-4516-a5ff-8b9f9baadef7"

+    Publisher="CN=mistachkin"

+    Version="1.0.0.0" />

+

+  <mp:PhoneIdentity PhoneProductId="bb52b3e1-5c8a-4516-a5ff-8b9f9baadef7" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

+

+  <Properties>

+    <DisplayName>vsixtest</DisplayName>

+    <PublisherDisplayName>mistachkin</PublisherDisplayName>

+    <Logo>Assets\StoreLogo.png</Logo>

+  </Properties>

+

+  <Dependencies>

+    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />

+  </Dependencies>

+

+  <Resources>

+    <Resource Language="x-generate"/>

+  </Resources>

+

+  <Applications>

+    <Application Id="App"

+      Executable="$targetnametoken$.exe"

+      EntryPoint="vsixtest.App">

+      <uap:VisualElements

+        DisplayName="vsixtest"

+        Square150x150Logo="Assets\Square150x150Logo.png"

+        Square44x44Logo="Assets\Square44x44Logo.png"

+        Description="vsixtest"

+        BackgroundColor="transparent">

+        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>

+        <uap:SplashScreen Image="Assets\SplashScreen.png" />

+      </uap:VisualElements>

+    </Application>

+  </Applications>

+

+  <Capabilities>

+    <Capability Name="internetClient" />

+  </Capabilities>

+</Package>
\ No newline at end of file
diff --git a/vsixtest/pch.cpp b/vsixtest/pch.cpp
new file mode 100644
index 0000000..ef288d8
--- /dev/null
+++ b/vsixtest/pch.cpp
@@ -0,0 +1,6 @@
+//

+// pch.cpp

+// Include the standard header and generate the precompiled header.

+//

+

+#include "pch.h"

diff --git a/vsixtest/pch.h b/vsixtest/pch.h
new file mode 100644
index 0000000..e5006e8
--- /dev/null
+++ b/vsixtest/pch.h
@@ -0,0 +1,11 @@
+//

+// pch.h

+// Header for standard system include files.

+//

+

+#pragma once

+

+#include <collection.h>

+#include <ppltasks.h>

+

+#include "App.xaml.h"

diff --git a/vsixtest/vsixtest.sln b/vsixtest/vsixtest.sln
new file mode 100644
index 0000000..bebec63
--- /dev/null
+++ b/vsixtest/vsixtest.sln
@@ -0,0 +1,40 @@
+

+Microsoft Visual Studio Solution File, Format Version 12.00

+# Visual Studio 14

+VisualStudioVersion = 14.0.24720.0

+MinimumVisualStudioVersion = 10.0.40219.1

+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vsixtest", "vsixtest.vcxproj", "{60BB14A5-0871-4656-BC38-4F0958230F9A}"

+EndProject

+Global

+	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+		Debug|ARM = Debug|ARM

+		Debug|x64 = Debug|x64

+		Debug|x86 = Debug|x86

+		Release|ARM = Release|ARM

+		Release|x64 = Release|x64

+		Release|x86 = Release|x86

+	EndGlobalSection

+	GlobalSection(ProjectConfigurationPlatforms) = postSolution

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|ARM.ActiveCfg = Debug|ARM

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|ARM.Build.0 = Debug|ARM

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|ARM.Deploy.0 = Debug|ARM

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|x64.ActiveCfg = Debug|x64

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|x64.Build.0 = Debug|x64

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|x64.Deploy.0 = Debug|x64

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|x86.ActiveCfg = Debug|Win32

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|x86.Build.0 = Debug|Win32

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Debug|x86.Deploy.0 = Debug|Win32

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|ARM.ActiveCfg = Release|ARM

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|ARM.Build.0 = Release|ARM

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|ARM.Deploy.0 = Release|ARM

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|x64.ActiveCfg = Release|x64

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|x64.Build.0 = Release|x64

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|x64.Deploy.0 = Release|x64

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|x86.ActiveCfg = Release|Win32

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|x86.Build.0 = Release|Win32

+		{60BB14A5-0871-4656-BC38-4F0958230F9A}.Release|x86.Deploy.0 = Release|Win32

+	EndGlobalSection

+	GlobalSection(SolutionProperties) = preSolution

+		HideSolutionNode = FALSE

+	EndGlobalSection

+EndGlobal

diff --git a/vsixtest/vsixtest.tcl b/vsixtest/vsixtest.tcl
new file mode 100644
index 0000000..3c0a8db
--- /dev/null
+++ b/vsixtest/vsixtest.tcl
@@ -0,0 +1,215 @@
+#!/usr/bin/tclsh
+#
+# This script is used to quickly test a VSIX (Visual Studio Extension) file
+# with Visual Studio 2015 on Windows.
+#
+# PREREQUISITES
+#
+# 1. Tcl 8.4 and later are supported, earlier versions have not been tested.
+#
+# 2. The "sqlite-UWP-output.vsix" file is assumed to exist in the parent
+#    directory of the directory containing this script.  The [optional] first
+#    command line argument to this script may be used to specify an alternate
+#    file.  However, currently, the file must be compatible with both Visual
+#    Studio 2015 and the Universal Windows Platform.
+#
+# 3. The temporary directory specified in the TEMP or TMP environment variables
+#    must refer to an existing directory writable by the current user.
+#
+# 4. The VS140COMNTOOLS environment variable must refer to the Visual Studio
+#    2015 common tools directory.
+#
+# USAGE
+#
+# The first argument to this script is optional.  If specified, it must be the
+# name of the VSIX file to test.
+#
+package require Tcl 8.4
+
+proc fail { {error ""} {usage false} } {
+  if {[string length $error] > 0} then {
+    puts stdout $error
+    if {!$usage} then {exit 1}
+  }
+
+  puts stdout "usage:\
+[file tail [info nameofexecutable]]\
+[file tail [info script]] \[vsixFile\]"
+
+  exit 1
+}
+
+proc getEnvironmentVariable { name } {
+  #
+  # NOTE: Returns the value of the specified environment variable or an empty
+  #       string for environment variables that do not exist in the current
+  #       process environment.
+  #
+  return [expr {[info exists ::env($name)] ? $::env($name) : ""}]
+}
+
+proc getTemporaryPath {} {
+  #
+  # NOTE: Returns the normalized path to the first temporary directory found
+  #       in the typical set of environment variables used for that purpose
+  #       or an empty string to signal a failure to locate such a directory.
+  #
+  set names [list]
+
+  foreach name [list TEMP TMP] {
+    lappend names [string toupper $name] [string tolower $name] \
+        [string totitle $name]
+  }
+
+  foreach name $names {
+    set value [getEnvironmentVariable $name]
+
+    if {[string length $value] > 0} then {
+      return [file normalize $value]
+    }
+  }
+
+  return ""
+}
+
+proc appendArgs { args } {
+  #
+  # NOTE: Returns all passed arguments joined together as a single string with
+  #       no intervening spaces between arguments.
+  #
+  eval append result $args
+}
+
+#
+# NOTE: This is the entry point for this script.
+#
+set script [file normalize [info script]]
+
+if {[string length $script] == 0} then {
+  fail "script file currently being evaluated is unknown" true
+}
+
+set path [file dirname $script]
+
+###############################################################################
+
+#
+# NOTE: Process and verify all the command line arguments.
+#
+set argc [llength $argv]
+if {$argc > 1} then {fail}
+
+if {$argc == 1} then {
+  set fileName [lindex $argv 0]
+} else {
+  set fileName [file join [file dirname $path] sqlite-UWP-output.vsix]
+}
+
+if {[string length $fileName] == 0} then {
+  fail "invalid VSIX file name"
+}
+
+if {![file exists $fileName] || ![file isfile $fileName]} then {
+  fail [appendArgs "VSIX file \"" $fileName "\" does not exist"]
+}
+
+set envVarName VS140COMNTOOLS
+set vsDirectory [getEnvironmentVariable $envVarName]
+
+if {[string length $vsDirectory] == 0} then {
+  fail [appendArgs \
+      "Visual Studio 2015 environment variable \"" $envVarName "\" missing"]
+}
+
+if {![file exists $vsDirectory] || ![file isdirectory $vsDirectory]} then {
+  fail [appendArgs \
+      "Visual Studio 2015 directory \"" $vsDirectory \
+      "\" does not exist"]
+}
+
+set vsixInstaller [file join [file dirname $vsDirectory] IDE VSIXInstaller.exe]
+
+if {![file exists $vsixInstaller] || ![file isfile $vsixInstaller]} then {
+  fail [appendArgs \
+      "Visual Studio 2015 VSIX installer \"" $vsixInstaller \
+      "\" does not exist"]
+}
+
+set envVarName ProgramFiles
+set programFiles [getEnvironmentVariable $envVarName]
+
+if {[string length $programFiles] == 0} then {
+  fail [appendArgs \
+      "Windows environment variable \"" $envVarName "\" missing"]
+}
+
+if {![file exists $programFiles] || ![file isdirectory $programFiles]} then {
+  fail [appendArgs \
+      "Program Files directory \"" $programFiles "\" does not exist"]
+}
+
+set msBuild [file join $programFiles MSBuild 14.0 Bin MSBuild.exe]
+
+if {![file exists $msBuild] || ![file isfile $msBuild]} then {
+  fail [appendArgs \
+      "MSBuild 14.0 executable file \"" $msBuild "\" does not exist"]
+}
+
+set temporaryDirectory [getTemporaryPath]
+
+if {[string length $temporaryDirectory] == 0 || \
+    ![file exists $temporaryDirectory] || \
+    ![file isdirectory $temporaryDirectory]} then {
+  fail "cannot locate a usable temporary directory"
+}
+
+set installLogFileName [appendArgs \
+    [file rootname [file tail $fileName]] -install- [pid] .log]
+
+set buildLogFileName [appendArgs \
+    [file rootname [file tail $fileName]] -build- [pid] .log]
+
+set uninstallLogFileName [appendArgs \
+    [file rootname [file tail $fileName]] -uninstall- [pid] .log]
+
+set command(1) [list exec [file nativename $vsixInstaller] /quiet /norepair]
+lappend command(1) [appendArgs /logFile: $installLogFileName]
+lappend command(1) [file nativename $fileName]
+
+set command(2) [list exec [file nativename $msBuild]]
+lappend command(2) [file nativename [file join $path vsixtest.sln]]
+lappend command(2) /target:Rebuild /property:Configuration=Release
+
+lappend command(2) [appendArgs \
+    /logger:FileLogger,Microsoft.Build.Engine\;Logfile= \
+    [file nativename [file join $temporaryDirectory $buildLogFileName]] \
+    \;Verbosity=diagnostic]
+
+set command(3) [list exec [file nativename $vsixInstaller] /quiet /norepair]
+lappend command(3) [appendArgs /logFile: $uninstallLogFileName]
+lappend command(3) [appendArgs /uninstall:SQLite.UWP.2015]
+
+puts stdout [appendArgs \
+    "Install log will be \"" [file nativename [file join \
+    $temporaryDirectory $installLogFileName]] "\"."]
+
+puts stdout [appendArgs \
+    "Build log will be \"" [file nativename [file join \
+    $temporaryDirectory $buildLogFileName]] "\"."]
+
+puts stdout [appendArgs \
+    "Uninstall log will be \"" [file nativename [file join \
+    $temporaryDirectory $uninstallLogFileName]] "\"."]
+
+puts stdout [appendArgs \
+    "First command is \"" $command(1) "\"."]
+
+puts stdout [appendArgs \
+    "Second command is \"" $command(2) "\"."]
+
+puts stdout [appendArgs \
+    "Third command is \"" $command(3) "\"."]
+
+# eval exec $command(1)
+# eval exec $command(2)
+# eval exec $command(3)
diff --git a/vsixtest/vsixtest.vcxproj b/vsixtest/vsixtest.vcxproj
new file mode 100644
index 0000000..a7b4fd3
--- /dev/null
+++ b/vsixtest/vsixtest.vcxproj
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <PropertyGroup Label="Globals">

+    <ProjectGuid>{60bb14a5-0871-4656-bc38-4f0958230f9a}</ProjectGuid>

+    <RootNamespace>vsixtest</RootNamespace>

+    <DefaultLanguage>en-US</DefaultLanguage>

+    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>

+    <AppContainerApplication>true</AppContainerApplication>

+    <ApplicationType>Windows Store</ApplicationType>

+    <WindowsTargetPlatformVersion>10.0.10586.0</WindowsTargetPlatformVersion>

+    <WindowsTargetPlatformMinVersion>10.0.10586.0</WindowsTargetPlatformMinVersion>

+    <ApplicationTypeRevision>10.0</ApplicationTypeRevision>

+  </PropertyGroup>

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

+  <ItemGroup Label="ProjectConfigurations">

+    <ProjectConfiguration Include="Debug|ARM">

+      <Configuration>Debug</Configuration>

+      <Platform>ARM</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|Win32">

+      <Configuration>Debug</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Debug|x64">

+      <Configuration>Debug</Configuration>

+      <Platform>x64</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|ARM">

+      <Configuration>Release</Configuration>

+      <Platform>ARM</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|Win32">

+      <Configuration>Release</Configuration>

+      <Platform>Win32</Platform>

+    </ProjectConfiguration>

+    <ProjectConfiguration Include="Release|x64">

+      <Configuration>Release</Configuration>

+      <Platform>x64</Platform>

+    </ProjectConfiguration>

+  </ItemGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>true</UseDebugLibraries>

+    <PlatformToolset>v140</PlatformToolset>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <WholeProgramOptimization>true</WholeProgramOptimization>

+    <PlatformToolset>v140</PlatformToolset>

+    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <WholeProgramOptimization>true</WholeProgramOptimization>

+    <PlatformToolset>v140</PlatformToolset>

+    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>

+  </PropertyGroup>

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

+    <ConfigurationType>Application</ConfigurationType>

+    <UseDebugLibraries>false</UseDebugLibraries>

+    <WholeProgramOptimization>true</WholeProgramOptimization>

+    <PlatformToolset>v140</PlatformToolset>

+    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>

+  </PropertyGroup>

+

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

+

+  <ImportGroup Label="ExtensionSettings">

+  </ImportGroup>

+

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+

+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

+  </ImportGroup>

+

+  <PropertyGroup Label="UserMacros" />

+

+  <PropertyGroup>

+    

+    <PackageCertificateKeyFile>vsixtest_TemporaryKey.pfx</PackageCertificateKeyFile>

+    

+  </PropertyGroup>

+

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">

+    <ClCompile>

+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>

+      <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>

+    </ClCompile>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">

+    <ClCompile>

+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>

+      <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>

+    </ClCompile>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

+    <ClCompile>

+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>

+      <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>

+    </ClCompile>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+    <ClCompile>

+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>

+      <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>

+    </ClCompile>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+    <ClCompile>

+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>

+      <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>

+    </ClCompile>

+  </ItemDefinitionGroup>

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

+    <ClCompile>

+      <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>

+      <DisableSpecificWarnings>4453;28204</DisableSpecificWarnings>

+    </ClCompile>

+  </ItemDefinitionGroup>

+

+  <ItemGroup>

+    <ClInclude Include="pch.h" />

+    <ClInclude Include="App.xaml.h">

+        <DependentUpon>App.xaml</DependentUpon>

+    </ClInclude>

+    <ClInclude Include="MainPage.xaml.h">

+        <DependentUpon>MainPage.xaml</DependentUpon>

+    </ClInclude>

+  </ItemGroup>

+

+  <ItemGroup>

+    <ApplicationDefinition Include="App.xaml">

+      <SubType>Designer</SubType>

+    </ApplicationDefinition>

+    <Page Include="MainPage.xaml">

+      <SubType>Designer</SubType>

+    </Page>

+  </ItemGroup>

+

+  <ItemGroup>

+    <AppxManifest Include="Package.appxmanifest">

+      <SubType>Designer</SubType>

+    </AppxManifest>

+    

+    <None Include="vsixtest_TemporaryKey.pfx" />

+    

+  </ItemGroup>

+

+  <ItemGroup>

+    <Image Include="Assets\LockScreenLogo.scale-200.png" />

+    <Image Include="Assets\SplashScreen.scale-200.png" />

+    <Image Include="Assets\Square150x150Logo.scale-200.png" />

+    <Image Include="Assets\Square44x44Logo.scale-200.png" />

+    <Image Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />

+    <Image Include="Assets\StoreLogo.png" />

+    <Image Include="Assets\Wide310x150Logo.scale-200.png" />

+  </ItemGroup>

+

+  <ItemGroup>

+    <ClCompile Include="App.xaml.cpp">

+        <DependentUpon>App.xaml</DependentUpon>

+    </ClCompile>

+    <ClCompile Include="MainPage.xaml.cpp">

+        <DependentUpon>MainPage.xaml</DependentUpon>

+    </ClCompile>

+

+    <ClCompile Include="pch.cpp">

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>

+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>

+    </ClCompile>

+  </ItemGroup>

+

+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+

+  <ImportGroup Label="ExtensionTargets">

+  </ImportGroup>

+

+</Project>

diff --git a/vsixtest/vsixtest.vcxproj.filters b/vsixtest/vsixtest.vcxproj.filters
new file mode 100644
index 0000000..a4a1a30
--- /dev/null
+++ b/vsixtest/vsixtest.vcxproj.filters
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>

+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

+  <ItemGroup>

+    <Filter Include="Common">

+      <UniqueIdentifier>60bb14a5-0871-4656-bc38-4f0958230f9a</UniqueIdentifier>

+    </Filter>

+    <Filter Include="Assets">

+      <UniqueIdentifier>e6271362-8f96-476d-907f-4da227b02435</UniqueIdentifier>

+      <Extensions>bmp;fbx;gif;jpg;jpeg;tga;tiff;tif;png</Extensions>

+    </Filter>

+    <Image Include="Assets\Logo.scale-100.png">

+      <Filter>Assets</Filter>

+    </Image>

+    <Image Include="Assets\SmallLogo.scale-100.png">

+      <Filter>Assets</Filter>

+    </Image>

+    <Image Include="Assets\StoreLogo.scale-100.png">

+      <Filter>Assets</Filter>

+    </Image>

+    <Image Include="Assets\SplashScreen.scale-100.png">

+      <Filter>Assets</Filter>

+    </Image>

+  </ItemGroup>

+</Project>

diff --git a/vsixtest/vsixtest_TemporaryKey.pfx b/vsixtest/vsixtest_TemporaryKey.pfx
new file mode 100644
index 0000000..e6787bc
--- /dev/null
+++ b/vsixtest/vsixtest_TemporaryKey.pfx
Binary files differ