Jak programowo znaleźć wersję ArcGIS?

9

Czy istnieje sposób za pomocą ArcObjects.net, aby dowiedzieć się, która wersja ArcGIS jest zainstalowana na komputerze (tj. 9.3., 10.0, 10.1)?

Nacięcie
źródło
a nawet lokalizacja rejestru byłaby pomocna. Potrzebuję tylko sposobu, aby program mógł dowiedzieć się, którą wersję ArcGIS zainstalował użytkownik. Ścieżki plików nie działają, ponieważ ArcGIS nie odinstalowuje starych folderów w folderze AppData
Nick

Odpowiedzi:

8

W ArcObjects .NET użyj RuntimeManager, np .:

Lista wszystkich zainstalowanych środowisk uruchomieniowych:

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

lub, aby uzyskać aktualnie aktywny środowisko wykonawcze:

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

Również w Arcpy możesz użyć GetInstallInfo .

blah238
źródło
Powód odmowy głosowania?
blah238
Dałem +1, więc byłem zaskoczony, gdy zobaczyłem 0, kiedy też się obejrzałem - podobało mi się również przypomnienie ArcPy.
PolyGeo
IIRC RuntimeManagerzostał wprowadzony wraz z ArcGIS 10.0 i dlatego nie można go używać do wykrywania wcześniejszych wersji ArcGIS.
stakx
To samo dotyczy ArcPy - który nie istniał jeszcze w wersjach wcześniejszych niż 10.0.
stakx
3

Na 64-bitowym komputerze z systemem Windows 7 ten klucz rejestru może pomóc. Mam zainstalowaną wersję 10.0, która wyświetla 10.0.2414.

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

Klewis
źródło
1
Ten jest przydatny, gdy ArcObjects jest niedostępny, używam go do budowania instalatorów.
Kelly Thomas
2
W 32-bitowym kluczem jest HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion
mwalker
@mwalker Również w wersji 64-bitowej z 10.1 widzę HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion, zastanawiam się, czy ten klucz istnieje w wersji 10.0?
Kirk Kuykendall
@Kirk, nie mam tego klucza w wersji 64-bitowej o 10.1 - ciekawe, dlaczego nie.
blah238,
@ blah238 Mam 10.1 sp1, zarówno na pulpicie, jak i na serwerze. Nie jestem pewien, która instalacja utworzyła klucz.
Kirk Kuykendall
1

Wydaje się, że istnieje interfejs o nazwie IArcGISVersion z metodą getVersions , która może być tym, czego potrzebujesz.

AKTUALIZACJA

Powyżej dotyczy Javy (dzięki @ blah238) - tutaj jest link do .NET (dzięki @JasonScheirer)

PolyGeo
źródło
Dotyczy to tylko Javy.
blah238
1
Link do wersji .Net .
Jason Scheirer
0

Możesz również uzyskać wersję ArcGIS, sprawdzając wersję AfCore.dll. Wymaga to znajomości katalogu instalacyjnego ArcGIS, który można uzyskać, sprawdzając rejestr lub zapisując go na stałe (dla większości użytkowników jest to C: \ Program Files (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
źródło