Wie können Sie die ArcGIS-Version programmgesteuert finden?

9

Gibt es eine Möglichkeit, mithilfe von ArcObjects.net herauszufinden, welche Version von ArcGIS auf einem Computer installiert ist (z. B. 9.3., 10.0, 10.1)?

Nick
quelle
oder sogar ein Registrierungsort wäre hilfreich. Ich brauche nur eine Möglichkeit für das Programm, um herauszufinden, welche Version von ArcGIS der Benutzer installiert hat. Dateipfade funktionieren nicht, da ArcGIS die alten Ordner im AppData-Ordner nicht zu deinstallieren scheint
Nick

Antworten:

8

Verwenden Sie in ArcObjects .NET den RuntimeManager, z.

Auflistung aller installierten Laufzeiten:

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());
}

oder, um nur die aktuell aktive Laufzeit zu erhalten:

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

Auch in arcpy können Sie GetInstallInfo verwenden .

blah238
quelle
Grund für die Ablehnung?
blah238
Ich gab +1 und war überrascht, 0 zu sehen, als ich gerade zurückblickte - ich mochte auch Ihre ArcPy-Erinnerung.
PolyGeo
IIRC RuntimeManagerwurde mit ArcGIS 10.0 eingeführt und kann daher nicht zum Erkennen früherer ArcGIS-Versionen verwendet werden.
Stakx
Gleiches gilt für ArcPy - das gab es in Versionen vor 10.0 noch nicht.
Stakx
3

Auf einem Win7 64-Bit-PC kann dieser Registrierungsschlüssel hilfreich sein. Ich habe 10.0 installiert und es liest 10.0.2414.

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

klewis
quelle
1
Dieser ist nützlich, wenn ArcObjects nicht verfügbar ist. Ich verwende ihn beim Erstellen von Installationsprogrammen.
Kelly Thomas
2
Auf 32-Bit ist dieser Schlüssel HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion
mwalker
@mwalker Auch auf 64 Bit mit 10.1 sehe ich HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion. Ich frage mich, ob dieser Schlüssel bei 10.0 vorhanden ist.
Kirk Kuykendall
@ Kirk, ich habe diesen Schlüssel nicht auf 64-Bit bei 10.1 - frage mich, warum nicht.
blah238
@ blah238 Ich habe 10.1 SP1, sowohl Desktop als auch Server installiert. Nicht sicher, welche Installation den Schlüssel erstellt hat.
Kirk Kuykendall
1

Es scheint eine Schnittstelle namens IArcGISVersion mit einer getVersions- Methode zu geben, die möglicherweise genau das ist, was Sie benötigen.

AKTUALISIEREN

Oben bezieht sich auf Java (danke @ blah238) - hier ist der Link zu .NET (danke @JasonScheirer)

PolyGeo
quelle
Das ist nur für Java.
blah238
1
Link zur .Net-Version .
Jason Scheirer
0

Sie können die ArcGIS-Version auch abrufen, indem Sie die Version von AfCore.dll abfragen. Dies setzt voraus, dass Sie das ArcGIS-Installationsverzeichnis kennen, das Sie entweder durch Abfragen der Registrierung oder durch Hardcodierung erhalten können (für die meisten Benutzer ist es C: \ Programme (x86) \ ArcGIS \ Desktop10.3 \).

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