Existe-t-il un moyen d'utiliser ArcObjects.net pour savoir quelle version d'ArcGIS est installée sur une machine (c'est-à-dire 9.3., 10.0, 10.1)?
Existe-t-il un moyen d'utiliser ArcObjects.net pour savoir quelle version d'ArcGIS est installée sur une machine (c'est-à-dire 9.3., 10.0, 10.1)?
Réponses:
Dans ArcObjects .NET, utilisez RuntimeManager, par exemple:
Liste de tous les runtimes installés:
var runtimes = RuntimeManager.InstalledRuntimes;
foreach (RuntimeInfo runtime in runtimes)
{
System.Diagnostics.Debug.Print(runtime.Path);
System.Diagnostics.Debug.Print(runtime.Version);
System.Diagnostics.Debug.Print(runtime.Product.ToString());
}
ou, pour obtenir simplement le runtime actuellement actif:
bool succeeded = ESRI.ArcGIS.RuntimeManager.Bind(ProductCode.EngineOrDesktop);
if (succeeded)
{
RuntimeInfo activeRunTimeInfo = RuntimeManager.ActiveRuntime;
System.Diagnostics.Debug.Print(activeRunTimeInfo.Product.ToString());
}
Toujours dans arcpy, vous pouvez utiliser GetInstallInfo .
RuntimeManager
été introduit avec ArcGIS 10.0 et ne peut donc pas être utilisé pour détecter des versions antérieures d'ArcGIS.
Sur un PC Win7 64 bits, cette clé de registre peut vous aider. J'ai 10.0 installé et il indique 10.0.2414.
\ HKLM \ software \ wow6432Node \ esri \ Arcgis \ RealVersion
Il semble y avoir une interface appelée IArcGISVersion avec une méthode getVersions qui peut être ce dont vous avez besoin.
MISE À JOUR
Ci-dessus concerne Java (merci @ blah238) - voici le lien vers .NET (merci @JasonScheirer)
Vous pouvez également obtenir la version d'ArcGIS en interrogeant la version d'AfCore.dll. Cela nécessite de connaître le répertoire d'installation d'ArcGIS, que vous pouvez obtenir en interrogeant le registre ou en codant en dur (c'est C: \ Program Files (x86) \ ArcGIS \ Desktop10.3 \ pour la plupart des utilisateurs).
/// <summary>
/// Find the version of the currently installed ArcGIS Desktop
/// </summary>
/// <returns>Version as a string in the format x.x or empty string if not found</returns>
internal string GetArcGISVersion()
{
try
{
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(Path.Combine(Path.Combine(GetInstallDir(), "bin"), "AfCore.dll"));
return string.Format("{0}.{1}", fvi.FileMajorPart, fvi.FileMinorPart);
}
catch (FileNotFoundException ex)
{
Console.WriteLine(string.Format("Could not get ArcGIS version: {0}. {1}", ex.Message, ex.StackTrace));
}
return "";
}
/// <summary>
/// Look in the registry to find the install directory of ArcGIS Desktop.
/// Searches in reverse order, so latest version is returned.
/// </summary>
/// <returns>Dir name or empty string if not found</returns>
private string GetInstallDir()
{
string installDir = "";
string esriKey = @"Software\Wow6432Node\ESRI";
foreach (string subKey in GetHKLMSubKeys(esriKey).Reverse())
{
if (subKey.StartsWith("Desktop"))
{
installDir = GetRegValue(string.Format(@"HKEY_LOCAL_MACHINE\{0}\{1}", esriKey, subKey), "InstallDir");
if (!string.IsNullOrEmpty(installDir))
return installDir;
}
}
return "";
}
/// <summary>
/// Returns all the subkey names for a registry key in HKEY_LOCAL_MACHINE
/// </summary>
/// <param name="keyName">Subkey name (full path excluding HKLM)</param>
/// <returns>An array of strings or an empty array if the key is not found</returns>
private string[] GetHKLMSubKeys(string keyName)
{
using (RegistryKey tempKey = Registry.LocalMachine.OpenSubKey(keyName))
{
if (tempKey != null)
return tempKey.GetSubKeyNames();
return new string[0];
}
}
/// <summary>
/// Reads a registry key and returns the value, if found.
/// Searches both 64bit and 32bit registry keys for chosen value
/// </summary>
/// <param name="keyName">The registry key containing the value</param>
/// <param name="valueName">The name of the value</param>
/// <returns>string representation of the actual value or null if value is not found</returns>
private string GetRegValue(string keyName, string valueName)
{
object regValue = null;
regValue = Registry.GetValue(keyName, valueName, null);
if (regValue != null)
{
return regValue.ToString();
}
// try again in 32bit reg
if (keyName.Contains("HKEY_LOCAL_MACHINE"))
regValue = Registry.GetValue(keyName.Replace(@"HKEY_LOCAL_MACHINE\Software", @"HKEY_LOCAL_MACHINE\Software\Wow6432Node"), valueName, null);
else if (keyName.Contains("HKEY_CURRENT_USER"))
regValue = Registry.GetValue(keyName.Replace(@"HKEY_CURRENT_USER\Software", @"HKEY_CURRENT_USER\Software\Wow6432Node"), valueName, null);
if (regValue != null)
{
return regValue.ToString();
}
return "";
}