in packages/csharp/PortingAssistant/PortingAssistant.VisualStudio/VisualStudioFinder.cs [55:118]
private static ISetupInstance2 GetLatestPath()
{
var result = default(ISetupInstance2);
var resultVersion = new Version(0, 0);
try
{
// This code is not obvious. See the sample (link above) for reference.
var query = (ISetupConfiguration2)GetQuery();
var e = query.EnumAllInstances();
int fetched;
var instances = new ISetupInstance[1];
do
{
// Call e.Next to query for the next instance (single item or nothing returned).
e.Next(1, instances, out fetched);
if (fetched <= 0)
{
continue;
}
var instance = (ISetupInstance2)instances[0];
var state = instance.GetState();
if (!Version.TryParse(instance.GetInstallationVersion(), out var version))
{
continue;
}
// If the install was complete and a valid version, consider it.
if (state == InstanceState.Complete ||
(state.HasFlag(InstanceState.Registered) && state.HasFlag(InstanceState.NoRebootRequired)))
{
var instanceHasMSBuild = false;
foreach (var package in instance.GetPackages())
{
if (string.Equals(package.GetId(), "Microsoft.Component.MSBuild", StringComparison.OrdinalIgnoreCase))
{
instanceHasMSBuild = true;
break;
}
}
if (instanceHasMSBuild && instance != null && version > resultVersion)
{
result = instance;
resultVersion = version;
}
}
}
while (fetched > 0);
}
catch (COMException)
{
}
catch (DllNotFoundException)
{
// This is OK, VS "15" or greater likely not installed.
}
return result;
}