ArcGIS sürümünü programlı olarak nasıl bulabilirsiniz?


9

Bir makinede hangi ArcGIS sürümünün yüklü olduğunu bulmak için ArcObjects.net'i kullanmanın bir yolu var mı (yani 9.3., 10.0, 10.1)?


hatta bir kayıt defteri konumu bile yardımcı olabilir. Programın, kullanıcının hangi ArcGIS sürümünü yüklediğini anlaması için bir yola ihtiyacım var. ArcGIS, AppData klasöründeki eski klasörleri kaldırmıyor gibi göründüğü için dosya yolları çalışmaz
Nick

Yanıtlar:


8

ArcObjects .NET'te RuntimeManager'ı kullanın örn:

Yüklü tüm çalışma zamanlarını listeleme:

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

veya şu anda etkin olan çalışma zamanını almak için:

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

Ayrıca arcpy'de GetInstallInfo kullanabilirsiniz .


Downvote nedeniniz?
blah238

+1 verdim, şimdi de geriye baktığımda 0'ı görünce şaşırdım - ArcPy hatırlatıcınızı da beğendim.
PolyGeo

IIRC RuntimeManager, ArcGIS 10.0 ile tanıtıldı ve bu nedenle önceki ArcGIS sürümlerini tespit etmek için kullanılamaz.
stakx

Aynı şey ArcPy için de geçerli - 10.0'dan önceki sürümlerde henüz mevcut değildi.
stakx

3

Win7 64 bit bir bilgisayarda bu Kayıt Defteri Anahtarı yardımcı olabilir. 10.0 kurulu ve 10.0.2414.

\ HKLM \ Software \ Wow6432Node \ ESRI \ ArcGIS \ RealVersion


1
Bu bir ArcObjects kullanılabilir olmadığında, yükleyiciler oluştururken kullanıyorum için yararlıdır.
Kelly Thomas

2
32 bitte bu anahtar HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion
mwalker

@mwalker Ayrıca 10.1 ile 64 bit üzerinde HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion, bu anahtarın 10.0'da var olup olmadığını merak ediyorum?
Kirk Kuykendall

@Kirk, 10.1'de 64 bit üzerinde bu anahtarım yok - neden olmasın.
blah238

@ blah238 Hem masaüstü hem de sunucu yüklü 10.1 sp1'im var. Hangi kurulumun anahtarı oluşturduğundan emin değilim.
Kirk Kuykendall


0

Ayrıca AfCore.dll sürümünü sorgulayarak ArcGIS sürümünü alabilirsiniz. Bu, kayıt defterini sorgulayarak veya sabit kodlamayla alabileceğiniz ArcGIS yükleme dizinini bilmenizi gerektirir (çoğu kullanıcı için 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 "";
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.