Existe uma maneira de usar o ArcObjects.net para descobrir qual versão do ArcGIS está instalada em uma máquina (ou seja, 9.3., 10.0, 10.1)?
Existe uma maneira de usar o ArcObjects.net para descobrir qual versão do ArcGIS está instalada em uma máquina (ou seja, 9.3., 10.0, 10.1)?
Respostas:
No ArcObjects .NET, use o RuntimeManager, por exemplo:
Listando todos os tempos de execução instalados:
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, para obter apenas o tempo de execução ativo no momento:
bool succeeded = ESRI.ArcGIS.RuntimeManager.Bind(ProductCode.EngineOrDesktop);
if (succeeded)
{
RuntimeInfo activeRunTimeInfo = RuntimeManager.ActiveRuntime;
System.Diagnostics.Debug.Print(activeRunTimeInfo.Product.ToString());
}
Também no arcpy, você pode usar GetInstallInfo .
RuntimeManager
foi introduzido com o ArcGIS 10.0 e, portanto, não pode ser usado para detectar versões anteriores do ArcGIS.
Em um PC Win7 de 64 bits, essa Chave do Registro pode ajudar. Eu tenho o 10.0 instalado, e ele lê 10.0.2414.
\ HKLM \ software \ wow6432Node \ esri \ Arcgis \ RealVersion
Parece haver uma interface chamada IArcGISVersion com um método getVersions que pode ser o que você precisa.
ATUALIZAR
Acima se refere ao Java (obrigado @ blah238) - aqui está o link para o .NET (obrigado @JasonScheirer)
Você também pode obter a versão do ArcGIS consultando a versão do AfCore.dll. Isso requer conhecer o diretório de instalação do ArcGIS, que você pode obter consultando o registro ou codificando (é C: \ Arquivos de Programas (x86) \ ArcGIS \ Desktop10.3 \ para a maioria dos usuários).
/// <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 "";
}