Add-in ArcMap dengan app.settings tidak mengenali perubahan app.config?

14

Saya telah mengembangkan Add-in ArcMap yang membutuhkan file konfigurasi. Setelah menghabiskan beberapa saat mencoba membaca nilai konfigurasi dari file App.Config tunggal (dan selalu mendapatkan nol) Saya percaya bahwa Add-in tidak dapat membaca nilai dari sini karena ini adalah perpustakaan kelas, dan mencari aplikasi panggilan (ArcMap) File konfigurasi ketika saya meminta nilai kunci (karenanya nol).

Untuk menyiasati ini saya menggunakan file App.Settings, yang dapat dibaca aplikasi dengan baik. Membuat ini juga memperkenalkan file App.Config ke lingkungan dan Visual Studio tampaknya menjaga dua file tetap sinkron selama pengembangan.

Sekarang Add-in sedang digunakan saya harus dapat mengubah nilai-nilai konfigurasi (misalnya lokasi file log). Saya telah mencoba membuka / mengekstrak file .esriaddin dan memperbarui file App.Config di sana tetapi Add-in mempertahankan nilai konfigurasi yang sama ketika dikompilasi. Saya tahu bahwa nilai-nilai App.Config baru sedang dipertahankan dalam file .esriaddin karena saya dapat melihatnya lagi setelah menutup arsip.

Adakah yang tahu cara tepercaya untuk mengonfigurasi Add-in dan mengizinkan konfigurasi ini dapat diperbarui setelah digunakan? Setiap saran sangat diterima karena tampaknya konyol bahwa saya harus memerlukan file konfigurasi khusus untuk ini.

Nilai App.Settings berada pada level aplikasi, dan saat ini App.Settings dan App.Config memiliki action build: tidak ada / tidak menyalin.

Tomfumb
sumber

Jawaban:

8

Saya menemukan cara mengkonfigurasi addin.

File addin di ... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... akan diperluas setiap kali ArcMap dimuat, sehingga satu-satunya tempat file konfigurasi APAPUN yang tertanam dalam addin dapat diedit ada di sini. Saya tidak bereksperimen dengan menggunakan kunci registri atau menggunakan direktori konfigurasi addin khusus karena ini sepertinya berlebihan.

Pada akhirnya saya menggunakan file app.config (karena meskipun digunakan dengan pustaka kelas, yang mengabaikan file konfigurasi, itu masih akan diganti namanya sesuai dengan rakitan dan secara otomatis termasuk dalam arsip addin) untuk pengaturan saya. Berdasarkan tautan yang disediakan di atas, saya menggunakan kelas konfigurasi berikut

...

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

...

Untuk mengedit konfigurasi setelah addin digunakan, saya harus menutup ArcMap, buka file .esriAddIn dengan winrar, buka \ install dan buka file konfigurasi, edit, tutup editor, dan kemudian izinkan winrar untuk memperbarui file di dalam arsip. Kemudian memuat kembali ArcMap perubahan masuk. Mengganggu ini adalah salah satu hal pertama yang saya coba tapi saya pikir saya punya masalah karena editor untuk file konfigurasi masih terbuka ketika winrar memperbarui arsip.

Tomfumb
sumber
Apakah Anda mengalami kesalahan akhir-akhir ini dengan OpenMappedExeConfiguration? Saya menggunakan pendekatan serupa yang bekerja dengan baik sampai, hanya beberapa hari yang lalu, itu berhenti bekerja, mungkin setelah menginstal beberapa Pembaruan Windows. Lihat pertanyaan saya tentang StackOverflow ini .
blah238
@ blah238 Saya belum menguji add-in ini untuk sementara waktu dan tidak memiliki kesempatan untuk melakukannya sekarang. Namun jika Anda dapat merangkum pembaruan Windows / .NET terbaru Anda, saya dapat melihat apakah milik saya (Win7) cocok dan memberi tahu Anda
tomfumb
Satu-satunya yang saya lihat yang tampaknya relevan adalah pembaruan keamanan .NET 4 . Tidak yakin apakah itu juga akan mempengaruhi .NET 3.5 yang saya targetkan.
blah238
FYI, saya akhirnya menulis ulang logika konfigurasi add-in saya untuk menggunakan serialisasi XML (de) tradisional alih-alih sistem konfigurasi .NET, gambar utama yang saya pikir adalah bahwa file .config secara otomatis diekstraksi bersama dengan perakitan dari file .esriAddin - sesuatu yang Anda tidak bisa, sejauh yang saya tahu, lakukan dengan file XML yang sewenang-wenang - tetapi untuk tujuan saya, saya memutuskan saya tidak benar-benar perlu menyediakan konfigurasi default, hanya bertahan pengaturan khusus pengguna). Saya masih ingin tahu apakah ini juga memengaruhi pengembang tambahan lainnya.
blah238
Melihat sedikit lebih banyak dengan pendekatan .config dan Fusion mengungkapkan bahwa ESRI menggunakan Assembly.LoadFrom () untuk memuat rakitan tambahan. Dari apa yang saya baca ini bertentangan dengan praktik terbaik yang menyiapkan AppDomain terpisah untuk add-in, dan mungkin menjelaskan mengapa ConfigurationManager tidak repot mencari perakitan lokasi yang benar. Apa yang saya tidak mengerti adalah mengapa ia bahkan perlu mencari perakitan lagi ketika sudah dimuat di AppDomain default. Saya hanya dapat berasumsi bahwa pembaruan keamanan .NET mulai menegakkan bahwa lokasi perakitan diperiksa lebih sering.
blah238
6

Meminjam dari jawaban yang serupa , Anda dapat menggunakan ini di addin Anda:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");
Kirk Kuykendall
sumber
Terima kasih atas tipnya, jalan yang dibuat oleh di atas tidak valid karena memberi ... / addInName.dll / config.xml, tapi itu membuat saya di jalur yang benar. Saya sekarang menggunakan yang sedikit lebih sederhanathis.GetType().Assembly.Location + ".config"
tomfumb
2

File konfigurasi .NET standar adalah per aplikasi, bukan per perpustakaan. Ini berarti bahwa ketika addin Anda berjalan dalam proses ArcMap, pengaturan konfigurasi Anda harus ditentukan dalam ArcMap.exe.config yang perlu ditempatkan di samping ArcMap.exe.

Ini tentu saja tidak selalu memungkinkan dalam lingkungan produksi dan juga melanggar isolasi addins, yang merupakan salah satu alasan addins diperkenalkan di tempat pertama.

Anda perlu menyimpan pengaturan Anda secara berbeda, baik dalam file konfigurasi Anda sendiri (seperti yang ditunjukkan dalam jawaban Kirk) atau registri sistem.

Anda dapat memantau perubahan pada file konfigurasi Anda dengan berbagai cara, misalnya memanfaatkan kelas FileSystemWatcher .

Petr Krebs
sumber
1

The jawaban dengan Kirk Kuykendall tidak bekerja untuk saya, karena terus menunjuk ke .dll itu sendiri. Saya menggunakan berikut ini untuk menunjuk ke file konfigurasi

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

Sementara saya belum melihat model baru untuk ESRI Addin apa yang telah saya lakukan dan lihat dilakukan oleh orang lain adalah pengguna UserHive dalam registri. Anda kemudian dapat memiliki layar di addin Anda untuk memperbarui kaleng nilai yang Anda butuhkan.

Menggunakan file App.config cenderung mengharuskan Anda me-restart aplikasi / ekstensi sepenuhnya untuk membaca nilai-nilai baru; sementara itu lebih mudah untuk melakukan pembaruan on-the-fly dari registri.

Benar
sumber
0

Anda bisa mencoba memodifikasi salinan file konfigurasi yang terletak di cache Add-In Assembly . Saya percaya esriaddin hanya bisa diperluas satu kali oleh ArcGIS. Jadi modifikasi selanjutnya tidak boleh digunakan (meskipun harus memperhatikan bahwa file esriaddin lebih baru dari cache-nya).

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

XP: C: \ Documents and Settings \\ Local Settings \ Data Aplikasi \ ESRI \ Desktop10.0 \ AssemblyCache

James Schek
sumber
Saran yang menarik tetapi sayangnya ini tidak membuat perbedaan. File konfigurasi di direktori AssemblyCache ditulis ulang ketika ArcMap dimulai - Saya mengubah file konfigurasi di sini dan di AddIn di ... \ Documents \ ArcGIS \ AddIns \ Desktop10. 0 jadi saya tidak tahu dari mana nilai untuk menimpa berasal!
tomfumb
Menghargai input, tetapi sepertinya file .esriAddIn di Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... benar-benar diekstraksi setiap kali aplikasi dimuat, jadi semua perubahan dalam cache add-in assembly hilang.
tomfumb