ArcMap Add-in พร้อมกับ app.settings ไม่รู้จักการเปลี่ยนแปลง app.config?


14

ฉันได้พัฒนา ArcMap Add-in ซึ่งต้องการไฟล์การกำหนดค่า หลังจากใช้เวลาในขณะที่พยายามอ่านค่าการตั้งค่าจากไฟล์ App.Config ไฟล์เดียว (และทำให้เป็นโมฆะเสมอ) ฉันเชื่อว่า Add-in ไม่สามารถอ่านค่าจากที่นี่เนื่องจากเป็นไลบรารีคลาสและมองหาแอปพลิเคชันการโทร (ArcMap) ไฟล์กำหนดค่าเมื่อฉันขอค่าของคีย์ (ดังนั้นจึงเป็นโมฆะ)

เพื่อหลีกเลี่ยงปัญหานี้ฉันใช้ไฟล์ App.Settings ซึ่งแอปพลิเคชันสามารถอ่านได้ดี การสร้างสิ่งนี้ยังแนะนำไฟล์ App.Config ในสภาพแวดล้อมและ Visual Studio ดูเหมือนว่าจะทำให้ไฟล์ทั้งสองซิงค์ในระหว่างการพัฒนา

ตอนนี้กำลังมีการปรับใช้ Add-in ฉันต้องสามารถเปลี่ยนค่าการกำหนดค่า (เช่นตำแหน่งไฟล์บันทึก) ฉันได้ลองเปิด / แตกไฟล์. esriaddin และอัปเดตไฟล์ App.Config ในนั้น แต่ Add-in ยังคงรักษาค่าการตั้งค่าเดิมที่รวบรวมไว้เมื่อรวบรวม ฉันรู้ว่าค่า App.Config ใหม่นั้นยังคงอยู่ในไฟล์. esriaddin เพราะฉันสามารถดูได้อีกครั้งหลังจากปิดไฟล์เก็บถาวร

ไม่มีใครรู้วิธีที่เชื่อถือได้ในการกำหนดค่า Add-in และอนุญาตให้การกำหนดค่านี้สามารถอัปเดตได้เมื่อนำไปใช้งานหรือไม่ ข้อเสนอแนะใด ๆ ยินดีอย่างมากเพราะมันไร้สาระที่ฉันควรจะต้องมีไฟล์ปรับแต่งสำหรับสิ่งนี้

ค่า App.Settings อยู่ที่ระดับแอปพลิเคชันและในปัจจุบันทั้ง App.Settings และ App.Config มีบิลด์แอ็คชัน: none / do copy

คำตอบ:


8

ฉันหาวิธีกำหนดค่า Addin

ไฟล์ addin ใน ... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... ได้รับการขยายทุกครั้งที่โหลด ArcMap ดังนั้นที่เดียวที่สามารถแก้ไขไฟล์ config ใด ๆ ที่ฝังอยู่ใน addin ได้ที่นี่ ฉันไม่ได้ทดลองกับการใช้รีจิสตรีคีย์หรือใช้ไดเรกทอรีการกำหนดค่า addin เฉพาะเพราะนี่ดูเหมือนเกินความจริง

ในที่สุดฉันก็ใช้ไฟล์ app.config (เพราะแม้ว่าจะใช้กับไลบรารีคลาสซึ่งละเว้นไฟล์ config มันก็ยังคงได้รับการเปลี่ยนชื่อตามแอสเซมบลีและรวมอยู่ในการเก็บถาวร Addin อัตโนมัติ) สำหรับการตั้งค่า จากลิงก์ที่ให้ไว้ข้างต้นฉันใช้คลาสการกำหนดค่าต่อไปนี้

...

    public AppConfig()
    {
        try
        {
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = this.GetType().Assembly.Location + ".config";
            config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        }
        catch (Exception)
        {
            ...
        }
    }

    private string getValue(string key) 
    {
        return config.AppSettings.Settings[key].Value;
    }

...

ในการแก้ไขการกำหนดค่าเมื่อมีการติดตั้ง addin ฉันต้องปิด ArcMap เปิดไฟล์. esriAddIn ด้วย winrar ไปที่ \ install และเปิดไฟล์ config แก้ไขปิดตัวแก้ไขแล้วอนุญาตให้ winrar อัปเดตไฟล์ภายใน เก็บ จากนั้นทำการโหลด ArcMap ใหม่อีกครั้งการเปลี่ยนแปลงครั้งนี้น่ารำคาญนี่เป็นหนึ่งในสิ่งแรกที่ฉันลอง แต่ฉันคิดว่าฉันมีปัญหาเพราะตัวแก้ไขไฟล์ config ยังคงเปิดอยู่เมื่อ winrar อัปเดตไฟล์เก็บถาวร


คุณพบข้อผิดพลาดเมื่อเร็ว ๆ นี้กับ OpenMappedExeConfiguration หรือไม่? ฉันใช้วิธีการที่คล้ายกันซึ่งใช้งานได้ดีจนกระทั่งเมื่อสองสามวันก่อนมันหยุดทำงานบางทีหลังจากติดตั้ง Windows Update บางตัว ดูStackOverflowนี้คำถามของฉัน
blah238

@ blah238 ฉันยังไม่ได้ทดสอบ Add-in นี้มาระยะหนึ่งแล้วและยังไม่มีโอกาสเลย แต่ถ้าคุณสามารถสรุปของ Windows ล่าสุดของคุณ / .NET ปรับปรุงผมสามารถดูได้ว่าการเหมืองแร่ (Win7) จับคู่และแจ้งให้คุณทราบ
tomfumb

เพียงคนเดียวที่ผมเห็นว่าดูเหมือนเกี่ยวข้องเป็นการปรับปรุงการรักษาความปลอดภัย 4 .NET ไม่แน่ใจว่านั่นอาจส่งผลกระทบต่อ. NET 3.5 ซึ่งเป็นสิ่งที่ฉันกำหนดเป้าหมาย
blah238

FYI ฉันลงเอยด้วยการเขียนตรรกะการกำหนดค่าของ add-in ของฉันใหม่เพื่อใช้การทำให้เป็นอนุกรม XML (de) การทำให้เป็นอนุกรมแทนระบบการกำหนดค่า. NET การดึงหลักที่ฉันคิดคือไฟล์. config ถูกแยกโดยอัตโนมัติพร้อมกับ แอสเซมบลีจากไฟล์. esriAddin - สิ่งที่คุณทำไม่ได้เท่าที่ฉันสามารถบอกได้ทำกับไฟล์ XML ที่กำหนดเอง - แต่สำหรับวัตถุประสงค์ของฉันฉันตัดสินใจว่าฉันไม่จำเป็นต้องจัดหาการกำหนดค่าเริ่มต้น การตั้งค่าเฉพาะผู้ใช้) ฉันยังต้องการทราบว่าสิ่งนี้จะส่งผลกระทบต่อนักพัฒนา Add-in รายอื่นหรือไม่
blah238

ลองพูดอีกสักหน่อยด้วยวิธี. config และ Fusion พบว่า ESRI ใช้ Assembly.LoadFrom () เพื่อโหลดแอสเซมบลี Add-in จากสิ่งที่ฉันได้อ่านสิ่งนี้ขัดกับแนวปฏิบัติที่ดีที่สุดซึ่งตั้งค่า AppDomain แยกต่างหากสำหรับ Add-in และอาจอธิบายว่าทำไม ConfigurationManager จึงไม่ต้องมองหาแอสเซมบลีตำแหน่งที่ถูกต้อง สิ่งที่ฉันไม่เข้าใจคือเหตุผลว่าทำไมถึงต้องค้นหาแอสเซมบลีอีกครั้งเมื่อโหลดใน AppDomain เริ่มต้นแล้ว ฉันสามารถสันนิษฐานได้ว่าการอัพเดทความปลอดภัย. NET เริ่มบังคับให้แอสเซมบลีตำแหน่งนั้นถูกตรวจสอบบ่อยขึ้น
blah238

6

ยืมจากคำตอบที่คล้ายกันคุณอาจใช้สิ่งนี้ใน addin ของคุณ:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");

ขอบคุณสำหรับเคล็ดลับเส้นทางที่สร้างโดยข้างต้นไม่ถูกต้องเนื่องจากมันให้ ... / addInName.dll / config.xml แต่มันทำให้ฉันได้รับการติดตามอย่างถูกต้อง ตอนนี้ผมใช้ง่ายเล็กน้อยthis.GetType().Assembly.Location + ".config"
tomfumb

2

ไฟล์การกำหนดค่า. NET มาตรฐานเป็นแบบต่อแอพพลิเคชัน ซึ่งหมายความว่าเมื่อ Addin ของคุณทำงานในกระบวนการ ArcMap การตั้งค่าการกำหนดค่าของคุณจะต้องระบุใน ArcMap.exe.config ซึ่งจะต้องมีการวางไว้ข้างๆ ArcMap.exe

ซึ่งแน่นอนว่าเป็นไปไม่ได้เสมอในสภาพแวดล้อมการผลิตและยังเป็นการละเมิดการแยก Addins ซึ่งเป็นหนึ่งในเหตุผลที่ Addins ถูกนำมาใช้ตั้งแต่แรก

คุณจะต้องจัดเก็บการตั้งค่าของคุณแตกต่างกันไม่ว่าจะในไฟล์ปรับแต่งของคุณเอง (ตามที่ระบุไว้ในคำตอบของ Kirk) หรือการลงทะเบียนระบบ

คุณสามารถตรวจสอบการเปลี่ยนแปลงของไฟล์ปรับแต่งได้หลายวิธีเช่นใช้ประโยชน์จากคลาสFileSystemWatcher


1

คำตอบโดยเคิร์ก Kuykendallไม่ได้ทำงานสำหรับฉันเพราะมันเก็บไว้ที่ชี้ไปยัง .dll ตัวเอง ฉันใช้สิ่งต่อไปนี้เพื่อชี้ไปที่ไฟล์ปรับแต่ง

System.IO.StreamReader file = new System.IO.StreamReader(System.IO.Path.GetDirectoryName(this.GetType().Assembly.Location) + "\\config.cfg");

0

ในขณะที่ฉันไม่ได้ดูรุ่นใหม่สำหรับ ESRI Addin ของสิ่งที่ฉันทำและเห็นโดยคนอื่นเป็นผู้ใช้ของ UserHive ในรีจิสทรี จากนั้นคุณสามารถมีหน้าจอใน Addin ของคุณเพื่ออัปเดตค่าที่คุณต้องการ

การใช้ไฟล์ App.config ทำให้คุณต้องรีสตาร์ทแอพ / ส่วนขยายทั้งหมดเพื่ออ่านค่าใหม่ ในขณะที่มันง่ายกว่าที่จะทำการอัพเดทแบบทันทีจากรีจิสตรี


0

คุณอาจจะพยายามที่จะปรับเปลี่ยนสำเนาของไฟล์ config อยู่ในที่แคชเพิ่มในสภา ฉันเชื่อว่า esriaddin จะขยายตัวเพียงครั้งเดียวโดย ArcGIS ดังนั้นการแก้ไขที่ตามมาอาจไม่สามารถใช้ได้ (แม้ว่ามันควรสังเกตว่าไฟล์ esriaddin ใหม่กว่าแคช)

Vista / 7: C: \ Users \\ AppData \ Local \ ESRI \ Desktop10.0 \ AssemblyCache

XP: C: \ Documents and Settings \\ การตั้งค่าท้องถิ่น \ Data Data ES ES \ Desktop10.0 \ AssemblyCache


คำแนะนำที่น่าสนใจ แต่น่าเสียดายที่นี่ไม่ได้สร้างความแตกต่างไฟล์กำหนดค่าในไดเรกทอรี AssemblyCache นั้นเขียนทับเมื่อ ArcMap เริ่มต้น - ฉันเปลี่ยนไฟล์กำหนดค่าที่นี่และใน AddIn at ... \ Documents \ ArcGIS \ AddIns \ Desktop10 0 ดังนั้นฉันจึงไม่ทราบว่าคุณค่าของการเขียนทับมาจากไหน!
tomfumb

ขอบคุณอินพุต แต่ดูเหมือนว่าไฟล์. esriAddIn ใน Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... ได้รับการแตกจริงทุกครั้งที่โหลดแอปพลิเคชันดังนั้นการเปลี่ยนแปลงทั้งหมดในแอสเซมบลีเพิ่มเข้าจะสูญหาย
tomfumb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.