คุณจะหาเวอร์ชั่น ArcGIS ได้อย่างไรโดยใช้โปรแกรม?


9

มีวิธีใช้ ArcObjects.net หรือไม่เพื่อดูว่า ArcGIS รุ่นใดติดตั้งในเครื่อง (เช่น 9.3., 10.0, 10.1)


หรือแม้แต่ตำแหน่งรีจิสตรีก็จะเป็นประโยชน์ ฉันแค่ต้องการวิธีการที่โปรแกรมจะทราบว่าผู้ใช้ติดตั้ง ArcGIS รุ่นใด เส้นทางไฟล์จะไม่ทำงานเนื่องจาก ArcGIS ดูเหมือนจะไม่ถอนการติดตั้งโฟลเดอร์เก่าในโฟลเดอร์ AppData
Nick

คำตอบ:


8

ใน ArcObjects .NET ให้ใช้RuntimeManagerเช่น:

รายการ runtimes ที่ติดตั้งทั้งหมด:

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

หรือหากต้องการรับรันไทม์ที่ใช้งานอยู่ในปัจจุบัน:

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

นอกจากนี้ใน arcpy คุณสามารถใช้GetInstallInfo


เหตุผลสำหรับการลงคะแนน?
blah238

ฉันให้ +1 ก็แปลกใจที่เห็น 0 เมื่อฉันมองย้อนกลับไปในขณะนี้ - ฉันยังชอบ ArcPy เตือนความจำของคุณ
PolyGeo

IIRC RuntimeManagerถูกนำมาใช้กับ ArcGIS 10.0 และดังนั้นจึงไม่สามารถใช้ในการตรวจสอบเวอร์ชั่น ArcGIS ก่อนหน้านี้
stakx

กันไปสำหรับ ArcPy - ที่ยังไม่มีในเวอร์ชันก่อนหน้า 10.0
stakx

3

ในพีซี Win7 64 บิตคีย์รีจิสทรีนี้อาจช่วยได้ ฉันติดตั้ง 10.0 แล้วและมันอ่าน 10.0.2414

ซอฟแวร์ \ HKLM \ \ Wow6432Node \ ESRI \ ArcGIS \ RealVersion


1
อันนี้มีประโยชน์เมื่อไม่พร้อมใช้งาน ArcObjects ฉันใช้เมื่อสร้างโปรแกรมติดตั้ง
Kelly Thomas

2
บนคีย์ 32 บิตนี้คือ HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion
mwalker

@mwalker บน 64 บิตพร้อม 10.1 ฉันเห็น HKLM \ SOFTWARE \ ESRI \ ArcGIS \ RealVersion ฉันสงสัยว่ากุญแจนี้มีอยู่ที่ 10.0 หรือไม่?
Kirk Kuykendall

@ โบสถ์ฉันไม่มีคีย์นั้นบน 64 บิตที่ 10.1 - สงสัยว่าทำไม
blah238

@ blah238 ฉันมี 10.1 sp1 ทั้งติดตั้งบนเดสก์ท็อปและเซิร์ฟเวอร์ ไม่แน่ใจว่าการติดตั้งใดสร้างรหัส
Kirk Kuykendall

1

ดูเหมือนว่าจะมีส่วนต่อประสานที่เรียกว่าIArcGISVersionด้วยวิธีการgetVersionsซึ่งอาจเป็นสิ่งที่คุณต้องการ

UPDATE

ด้านบนเกี่ยวข้องกับ Java (ขอบคุณ @ blah238) - นี่คือลิงค์ไปยัง. NET (ขอบคุณ @JasonScheirer)


นั่นสำหรับ Java เท่านั้น
blah238

1
เชื่อมโยงไปยังรุ่นสุทธิ
Jason Scheirer

0

นอกจากนี้คุณยังสามารถรับรุ่น ArcGIS โดยสอบถามรุ่น AfCore.dll สิ่งนี้จำเป็นต้องรู้ไดเรกทอรีติดตั้ง ArcGIS ซึ่งคุณสามารถรับได้โดยการสอบถามรีจิสตรีหรือโดยการเข้ารหัส (เป็นไฟล์ 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 "";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.