¿Cómo puede encontrar la versión de ArcGIS mediante programación?

9

¿Hay alguna manera de usar ArcObjects.net para averiguar qué versión de ArcGIS está instalada en una máquina (es decir, 9.3., 10.0, 10.1)?

Mella
fuente
o incluso una ubicación de registro sería útil. Solo necesito una forma para que el programa descubra qué versión de ArcGIS ha instalado el usuario. Las rutas de archivos no funcionarán porque ArcGIS no parece desinstalar las carpetas antiguas en la carpeta AppData
Nick

Respuestas:

8

En ArcObjects .NET, use el RuntimeManager, por ejemplo:

Listado de todos los tiempos de ejecución 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());
}

o, para obtener el tiempo de ejecución actualmente activo:

bool succeeded = ESRI.ArcGIS.RuntimeManager.Bind(ProductCode.EngineOrDesktop);
if (succeeded)
{
  RuntimeInfo activeRunTimeInfo = RuntimeManager.ActiveRuntime;
  System.Diagnostics.Debug.Print(activeRunTimeInfo.Product.ToString());
}

También en arcpy, puede usar GetInstallInfo .

blah238
fuente
¿Motivo del voto negativo?
blah238
Le di +1, así que me sorprendió ver 0 cuando también miré hacia atrás, también me gustó su recordatorio de ArcPy.
PolyGeo
IIRC RuntimeManagerse introdujo con ArcGIS 10.0 y, por lo tanto, no se puede utilizar para detectar versiones anteriores de ArcGIS.
stakx
Lo mismo ocurre con ArcPy, que aún no existía en versiones anteriores a 10.0.
stakx
3

En una PC Win7 de 64 bits, esta clave de registro puede ayudar. Tengo 10.0 instalado y dice 10.0.2414.

\ HKLM \ software \ wow6432Node \ esri \ Arcgis \ RealVersion

klewis
fuente
1
Este es útil para cuando ArcObjects no está disponible, lo uso cuando construyo instaladores.
Kelly Thomas
2
En 32 bits, esta clave es HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion
mwalker
@mwalker También en 64 bits con 10.1 Veo HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion, me pregunto si esta clave existe en 10.0.
Kirk Kuykendall el
@ Kirk, no tengo esa clave en 64 bits en 10.1, me pregunto por qué no.
blah238
@ blah238 Tengo 10.1 sp1, tanto el escritorio como el servidor instalados. No estoy seguro de qué instalación creó la clave.
Kirk Kuykendall
1

Parece que hay una interfaz llamada IArcGISVersion con un método getVersions que puede ser lo que necesita.

ACTUALIZAR

Lo anterior se relaciona con Java (gracias @ blah238) - aquí hay un enlace a .NET (gracias @JasonScheirer)

PolyGeo
fuente
Eso es solo para Java.
blah238
1
Enlace a la versión .Net .
Jason Scheirer
0

También puede obtener la versión de ArcGIS consultando la versión de AfCore.dll. Esto requiere conocer el directorio de instalación de ArcGIS, que puede obtener consultando el registro o codificando (es C: \ Archivos de programa (x86) \ ArcGIS \ Desktop10.3 \ para la mayoría de los usuarios).

/// <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
fuente