Como você pode encontrar a versão do ArcGIS programaticamente?

9

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)?

usuario
fonte
ou mesmo um local de registro seria útil. Eu só preciso de uma maneira do programa descobrir qual versão do ArcGIS o usuário instalou. Caminhos de arquivo não vai funcionar porque ArcGIS não parece desinstalar as antigas pastas na pasta AppData
Nick

Respostas:

8

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 .

blah238
fonte
Motivo para voto negativo?
blah238
Eu dei +1, então fiquei surpreso ao ver 0 quando olhei para trás agora também - também gostei do seu lembrete do ArcPy.
PolyGeo
O IIRC RuntimeManagerfoi introduzido com o ArcGIS 10.0 e, portanto, não pode ser usado para detectar versões anteriores do ArcGIS.
stakx
O mesmo vale para o ArcPy - que ainda não existia nas versões anteriores à 10.0.
stakx
3

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

klewis
fonte
11
Este é útil para quando o ArcObjects não está disponível, eu uso ao criar instaladores.
Kelly Thomas
2
Em 32 bits, essa chave é HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion
mwalker
@mwalker Também em 64 bits com 10.1 vejo HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion, gostaria de saber se essa chave existe em 10.0?
precisa saber é o seguinte
@ Kirk, eu não tenho essa chave em 64 bits na 10.1 - me pergunto por que não.
precisa saber é o seguinte
@ blah238 Eu tenho 10.1 sp1, desktop e servidor instalados. Não tenho certeza de qual instalação criou a chave.
precisa saber é o seguinte
1

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)

PolyGeo
fonte
Isso é apenas para Java.
precisa saber é o seguinte
11
Link para a versão .Net .
precisa saber é o seguinte
0

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 "";
}
jon_two
fonte