Bagaimana Anda dapat menemukan versi ArcGIS secara terprogram?

9

Apakah ada cara menggunakan ArcObjects.net untuk mengetahui versi ArcGIS apa yang diinstal pada mesin (mis. 9.3., 10.0, 10.1)?

Nick
sumber
atau bahkan lokasi registri akan sangat membantu. Saya hanya perlu cara agar program mengetahui versi ArcGIS apa yang telah diinstal pengguna. Jalur file tidak akan berfungsi karena ArcGIS tampaknya tidak menghapus folder lama di folder AppData
Nick

Jawaban:

8

Di ArcObjects .NET, gunakan RuntimeManager misalnya:

Cantumkan semua runtime yang dipasang:

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

atau, untuk mendapatkan runtime yang sedang aktif:

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

Juga di arcpy, Anda dapat menggunakan GetInstallInfo .

blah238
sumber
Alasan downvote?
blah238
Saya memberi +1 sehingga saya terkejut melihat 0 ketika saya melihat kembali sekarang juga - Saya juga menyukai pengingat ArcPy Anda.
PolyGeo
IIRC RuntimeManagerdiperkenalkan dengan ArcGIS 10.0, dan oleh karena itu tidak dapat digunakan untuk mendeteksi versi ArcGIS sebelumnya.
stakx
Hal yang sama berlaku untuk ArcPy - yang belum ada dalam versi sebelum 10.0.
stakx
3

Pada PC Win7 64 bit kunci registri ini dapat membantu. Saya sudah menginstal 10.0, dan membaca 10.0.2414.

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

Klewis
sumber
1
Yang ini berguna ketika ArcObjects tidak tersedia, saya gunakan ketika membangun installer.
Kelly Thomas
2
Pada 32-bit kunci ini adalah HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion
mwalker
@ walker Juga pada 64 bit dengan 10.1 Saya melihat HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion, saya ingin tahu apakah kunci ini ada di 10.0?
Kirk Kuykendall
@Kirk, saya tidak punya kunci 64-bit di 10.1 - heran kenapa tidak.
blah238
@ blah238 Saya punya 10.1 sp1, desktop dan server terpasang. Tidak yakin instalasi mana yang membuat kunci.
Kirk Kuykendall
1

Tampaknya ada antarmuka yang disebut IArcGISVersion dengan metode getVersions yang mungkin Anda butuhkan.

MEMPERBARUI

Di atas berkaitan dengan Java (thanks @ blah238) - ini adalah tautan ke .NET (thanks @JasonScheirer)

PolyGeo
sumber
Itu hanya untuk Java.
blah238
1
Tautan ke versi .Net .
Jason Scheirer
0

Anda juga bisa mendapatkan versi ArcGIS dengan menanyakan versi AfCore.dll. Ini membutuhkan mengetahui direktori instalasi ArcGIS, yang bisa Anda peroleh dengan menanyakan registri atau dengan hardcoding (ini C: \ Program Files (x86) \ ArcGIS \ Desktop10.3 \ untuk sebagian besar pengguna).

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