Comment trouver la version d'ArcGIS par programme?

9

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

pseudo
la source
ou même un emplacement de registre serait utile. J'ai juste besoin d'un moyen pour le programme de comprendre quelle version d'ArcGIS l'utilisateur a installée. Les chemins de fichiers ne fonctionneront pas car ArcGIS ne semble pas désinstaller les anciens dossiers du dossier AppData
Nick

Réponses:

8

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 .

blah238
la source
Raison du downvote?
blah238
J'ai donné +1, j'ai donc été surpris de voir 0 lorsque je me suis retourné en arrière - j'ai également aimé votre rappel ArcPy.
PolyGeo
IIRC a RuntimeManagerété introduit avec ArcGIS 10.0 et ne peut donc pas être utilisé pour détecter des versions antérieures d'ArcGIS.
stakx
Il en va de même pour ArcPy - qui n'existait pas encore dans les versions antérieures à 10.0.
stakx
3

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

klewis
la source
1
Celui-ci est utile lorsque ArcObjects n'est pas disponible, j'utilise lors de la construction des installateurs.
Kelly Thomas
2
Sur 32 bits, cette clé est HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion
mwalker
@mwalker Également sur 64 bits avec 10.1 Je vois HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion, je me demande si cette clé existe à 10.0?
Kirk Kuykendall
@Kirk, je n'ai pas cette clé sur 64 bits à 10.1 - je me demande pourquoi.
blah238
@ blah238 J'ai 10.1 sp1, le bureau et le serveur sont installés. Vous ne savez pas quelle installation a créé la clé.
Kirk Kuykendall
1

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)

PolyGeo
la source
C'est uniquement pour Java.
blah238
1
Lien vers la version .Net .
Jason Scheirer
0

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