Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions src/ext/VisualStudio/ca/vsca.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ static HRESULT ProcessVS2022(
__in BOOL fComplete
);

static HRESULT ProcessVS2026(
__in_opt ISetupInstance* pInstance,
__in DWORD64 qwVersion,
__in BOOL fComplete
);

static HRESULT SetPropertyForComponent(
__in DWORD cComponents,
__in VS_COMPONENT_PROPERTY* rgComponents,
Expand All @@ -70,6 +76,7 @@ static VS_INSTANCE vrgInstances[] =
{ FILEMAKEVERSION(15, 0, 0, 0), FILEMAKEVERSION(15, 0xffff, 0xffff, 0xffff), ProcessVS2017 },
{ FILEMAKEVERSION(16, 0, 0, 0), FILEMAKEVERSION(16, 0xffff, 0xffff, 0xffff), ProcessVS2019 },
{ FILEMAKEVERSION(17, 0, 0, 0), FILEMAKEVERSION(17, 0xffff, 0xffff, 0xffff), ProcessVS2022 },
{ FILEMAKEVERSION(18, 0, 0, 0), FILEMAKEVERSION(18, 0xffff, 0xffff, 0xffff), ProcessVS2026 },
};

/******************************************************************
Expand Down Expand Up @@ -566,6 +573,80 @@ static HRESULT ProcessVS2022(
return hr;
}

static HRESULT ProcessVS2026(
__in_opt ISetupInstance* pInstance,
__in DWORD64 qwVersion,
__in BOOL fComplete
)
{
static ISetupInstance* pLatest = NULL;
static DWORD64 qwLatest = 0;

static LPCWSTR rgwzProducts[] =
{
L"Microsoft.VisualStudio.Product.Community",
L"Microsoft.VisualStudio.Product.Professional",
L"Microsoft.VisualStudio.Product.Enterprise",
};

// TODO: Consider making table-driven with these defaults per-version for easy customization.
static VS_COMPONENT_PROPERTY rgComponents[] =
{
{ L"Microsoft.VisualStudio.Component.FSharp", L"VS2026_IDE_FSHARP_PROJECTSYSTEM_INSTALLED" },
{ L"Microsoft.VisualStudio.Component.Roslyn.LanguageServices", L"VS2026_IDE_VB_PROJECTSYSTEM_INSTALLED" },
{ L"Microsoft.VisualStudio.Component.Roslyn.LanguageServices", L"VS2026_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED" },
{ L"Microsoft.VisualStudio.PackageGroup.TestTools.Core", L"VS2026_IDE_VSTS_TESTSYSTEM_INSTALLED" },
{ L"Microsoft.VisualStudio.Component.VC.CoreIde", L"VS2026_IDE_VC_PROJECTSYSTEM_INSTALLED" },
{ L"Microsoft.VisualStudio.Component.Web", L"VS2026_IDE_VWD_PROJECTSYSTEM_INSTALLED" },
{ L"Microsoft.VisualStudio.PackageGroup.DslRuntime", L"VS2026_IDE_MODELING_PROJECTSYSTEM_INSTALLED" },
};

HRESULT hr = S_OK;

if (fComplete)
{
if (pLatest)
{
hr = ProcessInstance(pLatest, L"VS2026_ROOT_FOLDER", countof(rgComponents), rgComponents);
ExitOnFailure(hr, "Failed to process VS2026 instance.");
}
}
else if (pInstance)
{
hr = InstanceInProducts(pInstance, countof(rgwzProducts), rgwzProducts);
ExitOnFailure(hr, "Failed to compare product IDs.");

if (S_FALSE == hr)
{
ExitFunction();
}

hr = InstanceIsGreater(pLatest, qwLatest, pInstance, qwVersion);
ExitOnFailure(hr, "Failed to compare instances.");

if (S_FALSE == hr)
{
ExitFunction();
}

ReleaseNullObject(pLatest);

pLatest = pInstance;
qwLatest = qwVersion;

// Caller will do a final Release() otherwise.
pLatest->AddRef();
}

LExit:
if (fComplete)
{
ReleaseObject(pLatest);
}

return hr;
}

static HRESULT SetPropertyForComponent(
__in DWORD cComponents,
__in VS_COMPONENT_PROPERTY* rgComponents,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<PropertyRef Id="VS2017DEVENV" />
<PropertyRef Id="VS2019_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED" />
<PropertyRef Id="VS2022_ROOT_FOLDER" />
<PropertyRef Id="VS2026_ROOT_FOLDER" />

<Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
<ComponentGroupRef Id="ProductComponents" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ public void CanBuildUsingVsixPackage()
"CustomAction:SetVS2012Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2012_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2013Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2013_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2015Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2015_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2017Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2017_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2019Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2019_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2022Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2022_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2026Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2026_VSIX_INSTALLER_PATH]\t",
"CustomAction:vimLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3122\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\" /admin\t",
"CustomAction:viuMpl8IvFSDAzTulrmpAzBwAmCRTQ\t1074\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\"\t",
"CustomAction:vrmLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3442\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\" /admin\t",
Expand All @@ -36,7 +40,7 @@ public void CanBuildUsingVsixPackage()
"CustomAction:Vwd2012VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2012_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t",
"CustomAction:Vwd2013VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2013_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t",
"CustomAction:Vwd2015VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2015_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t",
"CustomAction:Wix4VSFindInstances_X86\t257\tVSCA_X86\tFindInstances\t",
"CustomAction:Wix4VSFindInstances_X86\t257\tWix4VSCA_X86\tFindInstances\t",
}, results);
}

Expand All @@ -55,6 +59,10 @@ public void CanBuildUsingVsixPackageOnArm64()
"CustomAction:SetVS2012Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2012_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2013Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2013_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2015Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2015_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2017Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2017_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2019Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2019_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2022Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2022_VSIX_INSTALLER_PATH]\t",
"CustomAction:SetVS2026Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2026_VSIX_INSTALLER_PATH]\t",
"CustomAction:vimLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3122\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\" /admin\t",
"CustomAction:viuMpl8IvFSDAzTulrmpAzBwAmCRTQ\t1074\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\"\t",
"CustomAction:vrmLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3442\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\" /admin\t",
Expand All @@ -64,7 +72,7 @@ public void CanBuildUsingVsixPackageOnArm64()
"CustomAction:Vwd2012VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2012_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t",
"CustomAction:Vwd2013VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2013_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t",
"CustomAction:Vwd2015VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2015_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t",
"CustomAction:Wix4VSFindInstances_A64\t257\tVSCA_A64\tFindInstances\t",
"CustomAction:Wix4VSFindInstances_A64\t257\tWix4VSCA_A64\tFindInstances\t",
}, customActionResults);

var propertyResults = results.Single(r => r.StartsWith("Property:SecureCustomProperties")).Split('\t')[1].Split(';');
Expand All @@ -77,9 +85,18 @@ public void CanBuildUsingVsixPackageOnArm64()
"VS2015_VSIX_INSTALLER_PATH",
"VS2017_IDE_DIR",
"VS2017_ROOT_FOLDER",
"VS2017_VSIX_INSTALLER_PATH",
"VS2017DEVENV",
"VS2019_IDE_DIR",
"VS2019_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED",
"VS2019_ROOT_FOLDER",
"VS2019_VSIX_INSTALLER_PATH",
"VS2022_IDE_DIR",
"VS2022_ROOT_FOLDER",
"VS2022_VSIX_INSTALLER_PATH",
"VS2026_IDE_DIR",
"VS2026_ROOT_FOLDER",
"VS2026_VSIX_INSTALLER_PATH",
"WIX_DOWNGRADE_DETECTED",
"WIX_UPGRADE_DETECTED",
}, propertyResults);
Expand Down
134 changes: 134 additions & 0 deletions src/ext/VisualStudio/wixlib/VS2026.wxs
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->


<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<?include ..\..\caDecor.wxi ?>

<Fragment>
<Property Id="VS2026_ROOT_FOLDER" Secure="yes" />
</Fragment>

<Fragment>
<PropertyRef Id="VS2026_ROOT_FOLDER" />
<Property Id="VS2026_IDE_DIR" Secure="yes">
<DirectorySearch Id="VS2026DirectorySearch" Path="[VS2026_ROOT_FOLDER]">
<DirectorySearch Id="VS2026EnvironmentDirectorySearch" Path="Common7\IDE" Depth="1" />
</DirectorySearch>
</Property>
</Fragment>

<Fragment>
<Property Id="VS2026_EXTENSIONS_DIR" Secure="yes">
<DirectorySearchRef Id="VS2026EnvironmentDirectorySearch" Parent="VS2026DirectorySearch" Path="Common7\IDE">
<DirectorySearch Id="VS2026ExtensionsDirectorySearch" Path="Extensions" Depth="1" />
</DirectorySearchRef>
</Property>
</Fragment>

<Fragment>
<Property Id="VS2026_PROJECTTEMPLATES_DIR" Secure="yes">
<DirectorySearchRef Id="VS2026EnvironmentDirectorySearch" Parent="VS2026DirectorySearch" Path="Common7\IDE">
<DirectorySearch Id="VS2026ProjectTemplatesDirectorySearch" Path="ProjectTemplates" Depth="1" />
</DirectorySearchRef>
</Property>
</Fragment>

<Fragment>
<PropertyRef Id="VS2026_ROOT_FOLDER" />
<Property Id="VS2026_SCHEMAS_DIR" Secure="yes">
<DirectorySearch Id="VS2026XmlDirectorySearch" Path="[VS2026_ROOT_FOLDER]\Xml" Depth="1">
<DirectorySearch Id="VS2026XmlSchemasDirectorySearch" Path="Schemas" Depth="1" />
</DirectorySearch>
</Property>
</Fragment>

<Fragment>
<Property Id="VS2026_ITEMTEMPLATES_DIR" Secure="yes">
<DirectorySearchRef Id="VS2026EnvironmentDirectorySearch" Parent="VS2026DirectorySearch" Path="Common7\IDE">
<DirectorySearch Id="VS2026ItemTemplatesDirectorySearch" Path="ItemTemplates" Depth="1" />
</DirectorySearchRef>
</Property>
</Fragment>

<Fragment>
<PropertyRef Id="VS2026_ROOT_FOLDER" />
<Property Id="VS2026_BOOTSTRAPPER_PACKAGE_FOLDER" Secure="yes">
<DirectorySearch Id="VS2026SDKDirectorySearch" Path="[VS2026_ROOT_FOLDER]\SDK" Depth="1">
<DirectorySearch Id="SearchForVS2026BootstrapperPackageDirectory" Path="Bootstrapper" Depth="1" />
</DirectorySearch>
</Property>
</Fragment>

<Fragment>
<Property Id="VS2026DEVENV" Secure="yes">
<DirectorySearchRef Id="VS2026EnvironmentDirectorySearch" Parent="VS2026DirectorySearch" Path="Common7\IDE">
<FileSearch Id="VS2026DevEnvSearch" Name="devenv.exe" />
</DirectorySearchRef>
</Property>
</Fragment>

<Fragment>
<CustomAction Id="VS2026Setup" Property="VS2026DEVENV" ExeCommand="/setup" Execute="deferred" Return="ignore" Impersonate="no" />
<PropertyRef Id="VS2026DEVENV" />

<InstallExecuteSequence>
<Custom Action="VS2026Setup" Before="InstallFinalize" Overridable="yes" Condition="VS2026DEVENV" />
</InstallExecuteSequence>
</Fragment>

<Fragment>
<CustomAction Id="VS2026InstallVSTemplates" Property="VS2026DEVENV" ExeCommand="/InstallVSTemplates" Execute="deferred" Return="ignore" Impersonate="no" />
<PropertyRef Id="VS2026DEVENV" />

<InstallExecuteSequence>
<Custom Action="VS2026InstallVSTemplates" Before="InstallFinalize" Overridable="yes" Condition="VS2026DEVENV" />
</InstallExecuteSequence>
</Fragment>

<!-- Indicates whether the Visual C# project system is installed as a part of -->
<!-- Visual Studio 2026 standard or higher. If this property is set, that -->
<!-- means Visual Studio 2026 standard or higher is installed and the Visual -->
<!-- C# language tools were installed as a part of VS 2026 setup. -->
<Fragment>
<Property Id="VS2026_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED" Secure="yes" />
</Fragment>

<!-- Indicates whether the Visual Basic project system is installed as a part of -->
<!-- Visual Studio 2026 standard or higher. If this property is set, that -->
<!-- means Visual Studio 2026 standard or higher is installed and the Visual -->
<!-- Basic language tools were installed as a part of VS 2026 setup. -->
<Fragment>
<Property Id="VS2026_IDE_VB_PROJECTSYSTEM_INSTALLED" Secure="yes" />
</Fragment>

<!-- Indicates whether the Visual Web Developer project system is installed as a part of -->
<!-- Visual Studio 2026 standard or higher. If this property is set, that -->
<!-- means Visual Studio 2026 standard or higher is installed and the Visual -->
<!-- Web Developer language tools were installed as a part of VS 2026 setup. -->
<Fragment>
<Property Id="VS2026_IDE_VWD_PROJECTSYSTEM_INSTALLED" Secure="yes" />
</Fragment>

<!-- Indicates whether the Visual C++ project system is installed as a part of -->
<!-- Visual Studio 2026 standard or higher. If this property is set, that -->
<!-- means Visual Studio 2026 standard or higher is installed and the Visual -->
<!-- C++ language tools were installed as a part of VS 2026 setup. -->
<Fragment>
<Property Id="VS2026_IDE_VC_PROJECTSYSTEM_INSTALLED" Secure="yes" />
</Fragment>

<!-- Indicates whether the Visual Studio 2026 Team Test project system is installed -->
<Fragment>
<Property Id="VS2026_IDE_VSTS_TESTSYSTEM_INSTALLED" Secure="yes" />
</Fragment>

<!-- Indicates whether the Visual Studio 2026 Modeling project system is installed -->
<Fragment>
<Property Id="VS2026_IDE_MODELING_PROJECTSYSTEM_INSTALLED" Secure="yes" />
</Fragment>

<!-- Indicates whether the Visual Studio 2026 F# project system is installed -->
<Fragment>
<Property Id="VS2026_IDE_FSHARP_PROJECTSYSTEM_INSTALLED" Secure="yes" />
</Fragment>
</Wix>
6 changes: 3 additions & 3 deletions src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->

<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
<?include ..\..\caDecor.wxi ?>

<Fragment>
<CustomAction Id="$(var.Prefix)VSFindInstances$(var.Suffix)" DllEntry="FindInstances" Execute="firstSequence" Return="check" SuppressModularization="yes" BinaryRef="VSCA$(var.Suffix)" />
<CustomAction Id="$(var.Prefix)VSFindInstances$(var.Suffix)" DllEntry="FindInstances" Execute="firstSequence" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)VSCA$(var.Suffix)" />
<InstallExecuteSequence>
<Custom Action="virtual $(var.Prefix)VSFindInstances$(var.Suffix)" Before="AppSearch" />
</InstallExecuteSequence>
Expand All @@ -14,6 +14,6 @@
</Fragment>

<Fragment>
<Binary Id="VSCA$(var.Suffix)" SourceFile="vsca.dll" />
<Binary Id="$(var.Prefix)VSCA$(var.Suffix)" SourceFile="!(bindpath.vsca.$(var.platform))vsca.dll" />
</Fragment>
</Include>
36 changes: 34 additions & 2 deletions src/ext/VisualStudio/wixlib/VsixPackage.wxs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->


<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
Expand Down Expand Up @@ -28,6 +28,30 @@
</RegistrySearch>
</Property>

<Property Id="VS2017_VSIX_INSTALLER_PATH" Secure="yes">
<DirectorySearchRef Id="VS2017EnvironmentDirectorySearch" Parent="VS2017DirectorySearch" Path="Common7\IDE">
<FileSearch Id="WixVS2017VsixInstaller" Name="VSIXInstaller.exe" />
</DirectorySearchRef>
</Property>

<Property Id="VS2019_VSIX_INSTALLER_PATH" Secure="yes">
<DirectorySearchRef Id="VS2019EnvironmentDirectorySearch" Parent="VS2019DirectorySearch" Path="Common7\IDE">
<FileSearch Id="WixVS2019VsixInstaller" Name="VSIXInstaller.exe" />
</DirectorySearchRef>
</Property>

<Property Id="VS2022_VSIX_INSTALLER_PATH" Secure="yes">
<DirectorySearchRef Id="VS2022EnvironmentDirectorySearch" Parent="VS2022DirectorySearch" Path="Common7\IDE">
<FileSearch Id="WixVS2022VsixInstaller" Name="VSIXInstaller.exe" />
</DirectorySearchRef>
</Property>

<Property Id="VS2026_VSIX_INSTALLER_PATH" Secure="yes">
<DirectorySearchRef Id="VS2026EnvironmentDirectorySearch" Parent="VS2026DirectorySearch" Path="Common7\IDE">
<FileSearch Id="WixVS2026VsixInstaller" Name="VSIXInstaller.exe" />
</DirectorySearchRef>
</Property>

<Property Id="VS_VSIX_INSTALLER_PATH" Secure="yes" />

<!-- VWD2012 registers differently than the rest of Visual Studio, so search for it in the case VS2012 is missing. -->
Expand All @@ -46,7 +70,15 @@
</Property>

<!-- Use the latest VS- or VWD-installed VSIXInstaller.exe. -->
<SetProperty Action="SetVS2015Vsix" Id="VS_VSIX_INSTALLER_PATH" Value="[VS2015_VSIX_INSTALLER_PATH]" Sequence="both" After="AppSearch" Condition="NOT VS_VSIX_INSTALLER_PATH AND VS2015_VSIX_INSTALLER_PATH" />
<SetProperty Action="SetVS2026Vsix" Id="VS_VSIX_INSTALLER_PATH" Value="[VS2026_VSIX_INSTALLER_PATH]" Sequence="both" After="AppSearch" Condition="NOT VS_VSIX_INSTALLER_PATH AND VS2026_VSIX_INSTALLER_PATH" />

<SetProperty Action="SetVS2022Vsix" Id="VS_VSIX_INSTALLER_PATH" Value="[VS2022_VSIX_INSTALLER_PATH]" Sequence="both" After="SetVS2026Vsix" Condition="NOT VS_VSIX_INSTALLER_PATH AND VS2022_VSIX_INSTALLER_PATH" />

<SetProperty Action="SetVS2019Vsix" Id="VS_VSIX_INSTALLER_PATH" Value="[VS2019_VSIX_INSTALLER_PATH]" Sequence="both" After="SetVS2022Vsix" Condition="NOT VS_VSIX_INSTALLER_PATH AND VS2019_VSIX_INSTALLER_PATH" />

<SetProperty Action="SetVS2017Vsix" Id="VS_VSIX_INSTALLER_PATH" Value="[VS2017_VSIX_INSTALLER_PATH]" Sequence="both" After="SetVS2019Vsix" Condition="NOT VS_VSIX_INSTALLER_PATH AND VS2017_VSIX_INSTALLER_PATH" />

<SetProperty Action="SetVS2015Vsix" Id="VS_VSIX_INSTALLER_PATH" Value="[VS2015_VSIX_INSTALLER_PATH]" Sequence="both" After="SetVS2017Vsix" Condition="NOT VS_VSIX_INSTALLER_PATH AND VS2015_VSIX_INSTALLER_PATH" />
<SetProperty Action="Vwd2015VsixWhenVSAbsent" Id="VS_VSIX_INSTALLER_PATH" Value="[VWD2015_VSIX_INSTALL_ROOT]\Common7\IDE\VSIXInstaller.exe" Sequence="both" After="SetVS2015Vsix" Condition="NOT VS_VSIX_INSTALLER_PATH AND VWD2015_VSIX_INSTALL_ROOT" />

<SetProperty Action="SetVS2013Vsix" Id="VS_VSIX_INSTALLER_PATH" Value="[VS2013_VSIX_INSTALLER_PATH]" Sequence="both" After="Vwd2015VsixWhenVSAbsent" Condition="NOT VS_VSIX_INSTALLER_PATH AND VS2013_VSIX_INSTALLER_PATH" />
Expand Down
Loading
Loading