App.config değişiklikleri app.config değişikliklerini tanımıyor ArcMap Eklentisi?


14

Bir yapılandırma dosyası gerektiren bir ArcMap Eklentisi geliştirdim. Tek bir App.Config dosyasından yapılandırma değerlerini okumaya çalışırken (ve her zaman null oluyor) bir süre geçirdikten sonra, eklentinin bir sınıf kütüphanesi olduğu için buradan değerleri okuyamayacağına ve çağıran uygulamayı (ArcMap) aradığına inanıyorum. bir anahtarın değerini istediğimde yapılandırma dosyası (dolayısıyla null).

Bu sorunu çözmek için uygulamanın iyi okuyabileceği bir App.Settings dosyası kullandım. Bunu oluşturmak aynı zamanda ortama bir App.Config dosyası ekler ve Visual Studio geliştirme sırasında bu iki dosyayı senkronize tutar.

Eklenti konuşlandırıldığına göre, yapılandırma değerlerini (örneğin günlük dosyası konumu) değiştirebilmem gerekiyor. .Esriaddin dosyasını açmayı / açmayı ve orada App.Config dosyasını güncellemeyi denedim ancak Eklenti derlendiğinde aynı yapılandırma değerlerini koruyor. Yeni App.Config değerlerinin .esriaddin dosyasında kalıcı olduğunu biliyorum çünkü arşivi kapattıktan sonra tekrar görüntüleyebiliyorum.

Herkes bir Eklentiyi yapılandırmanın güvenilir bir yolunu biliyor ve bu yapılandırmanın dağıtıldıktan sonra güncelleştirilebilir olmasına izin veriyor mu? Herhangi bir öneri çok hoşuma gitti gibi ben bunun için özel bir yapılandırma dosyası gerekir saçma görünüyor.

App.Settings değerleri uygulama düzeyindedir ve şu anda hem App.Settings hem de App.Config öğelerinin derleme eylemi vardır: yok / kopyalamıyor.

Yanıtlar:


8

Eklentiyi nasıl yapılandıracağımı anladım.

... Documents \ ArcGIS \ AddIns \ Desktop10.0 ... içindeki addin dosyası, ArcMap her yüklendiğinde genişletilir, bu nedenle eklentiye gömülü HERHANGİ yapılandırma dosyalarının düzenlenebileceği tek yer buradadır. Bu sadece overkill gibi görünüyordu kayıt defteri anahtarlarını veya özel bir addin yapılandırma dizini kullanarak deneme vermedi.

Sonunda, ayarlarım için bir app.config dosyası kullandım (çünkü yapılandırma dosyasını yok sayan bir sınıf kitaplığıyla kullanılsa bile, derleme ile aynı şekilde yeniden adlandırılır ve otomatik olarak addin arşivine dahil edilir). Yukarıda verilen bir bağlantıya dayanarak aşağıdaki yapılandırma sınıfını kullandım

...

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

...

Eklenti dağıtıldıktan sonra yapılandırmayı düzenlemek için ArcMap'i kapatmam, winrar ile .esriAddIn dosyasını açmam, yapılandırma dosyasını açıp yapılandırma dosyasını açmam, düzenlemeyi, editörü kapatmam ve ardından winrar'ın Arşiv. Sonra ArcMap yeniden yükleme değişikliği girer. Can sıkıcı bir şekilde bu denedim ilk şeylerden biri ama sanırım sorunları vardı çünkü winrar arşivi güncellediğinde yapılandırma dosyası editörü hala açıktı.


Son zamanlarda OpenMappedExeConfiguration ile herhangi bir hatayla karşılaştınız mı? Birkaç gün önce, belki de bazı Windows Güncellemelerini yükledikten sonra çalışmayı bırakana kadar iyi çalışan benzer bir yaklaşım kullanıyordum. Bu StackOverflow sorusuna bakın .
blah238

@ blah238 Bu eklentiyi bir süredir test etmedim ve şu anda yapma fırsatım yok. Ancak son Windows / .NET güncellemelerinizi özetleyebiliyorsanız, benimki (Win7) eşleşip eşleşmediğini görebilirim
tomfumb

İlgili göründüğüm tek .NET .NET güvenlik güncelleştirmesiydi . Bunun da hedeflediğim .NET 3.5'i etkileyip etkilemeyeceğinden emin değilim.
blah238

FYI, .NET yapılandırma sistemi yerine geleneksel XML (de) serileştirmeyi kullanmak için eklentimin yapılandırma mantığını yeniden yazdım, ana çizdiğim .config dosyasının otomatik olarak çıkarılmasıydı. .esriAddin dosyasından derleme - anlayabildiğim kadarıyla, rastgele bir XML dosyasıyla yapamayacağınız bir şey - ama benim amacım için gerçekten varsayılan bir yapılandırma sağlamam gerekmediğine karar verdim, sadece devam kullanıcıya özel ayarlar). Yine de bunun diğer eklenti geliştiricilerini de etkileyip etkilemediğini bilmek istiyorum.
blah238

.Config yaklaşımı ve Fusion ile biraz daha uğraşmak, ESRI'nin eklenti montajlarını yüklemek için Assembly.LoadFrom () yöntemini kullandığını gösterir. Ne okudum gelen bu eklentiler için ayrı bir AppDomain kurarak en iyi uygulama gider ve neden ConfigurationManager derleme doğru konumu aramak için rahatsız etmez açıklayabilir. Anlamadığım şey, neden zaten varsayılan AppDomain'e yüklendiğinde montajı tekrar araması gerektiğidir. Yalnızca bir .NET güvenlik güncelleştirmesinin derleme konumlarının daha sık denetlenmesini zorunlu kıldığını varsayabilirim.
blah238

6

Benzer bir cevaptan ödünç alarak , bunu eklentinizde kullanabilirsiniz:

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

Bahşiş için teşekkürler, yukarıdaki tarafından oluşturulan yol ... / addInName.dll / config.xml verdiğinden geçerli değil, ama beni doğru yolda buldu. Şimdi biraz daha basit kullanıyorumthis.GetType().Assembly.Location + ".config"
tomfumb

2

Standart .NET yapılandırma dosyası her kitaplık için değil, uygulama içindir. Bu, eklentiniz ArcMap işlemi içinde çalıştığında, yapılandırma ayarlarınızın ArcMap.exe.config dosyasında ArcMap.exe'nin yanına yerleştirilmesi gerektiğini belirtmeniz gerektiği anlamına gelir.

Bu elbette üretim ortamında her zaman mümkün değildir ve ayrıca eklentilerin ilk etapta sokulma nedenlerinden biri olan ekinlerin izolasyonunu da ihlal eder.

Ayarlarınızı, kendi yapılandırma dosyasında (Kirk'ün cevabında ima edildiği gibi) veya sistem kayıt defterinde farklı şekilde saklamanız gerekecektir.

Yapılandırma dosyanızdaki değişiklikleri, örneğin FileSystemWatcher sınıfından yararlanarak çeşitli şekillerde izleyebilirsiniz .


1

Kirk Kuykendall tarafından cevap o .dll kendisine işaret etti beri, benim için çalış yoktu. Yapılandırma dosyasını işaret etmek için aşağıdakileri kullandım

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

0

ESRI Addin'in yeni modeline bakmasam da, başkaları tarafından yaptım ve gördüklerim kayıt defterinde UserHive'ın kullanıcısı. Daha sonra, ihtiyacınız olan değerlerin kutularını güncellemek için eklentinizde bir ekranınız olabilir.

Bir App.config dosyası kullanmak, yeni değerleri okumak için uygulamayı / uzantıyı tamamen yeniden başlatmanızı gerektirir; kayıt defterinden anında güncellemeler yapmak daha kolaydır.


0

Eklenti Derleme önbelleğinde bulunan yapılandırma dosyasının kopyasını değiştirmeyi deneyebilirsiniz . Esadaddin'in ArcGIS tarafından sadece bir kez genişletildiğine inanıyorum. Bu nedenle sonraki değişiklikler kullanılamayabilir (ancak esriaddin dosyasının önbelleğinden daha yeni olduğunu fark etmelidir ).

Vista / 7: C: \ Kullanıcılar \\ AppData \ Local \ ESRI \ Desktop10.0 \ AssemblyCache

XP: C: \ Belgeler ve Ayarlar \\ Yerel Ayarlar \ Uygulama Verileri \ ESRI \ Desktop10.0 \ AssemblyCache


İlginç bir öneri ama ne yazık ki bu bir fark yaratmadı.ArcMap başladığında AssemblyCache dizinindeki yapılandırma dosyası üzerine yazılır - Yapılandırma dosyasını burada değiştirdim ve ... \ Documents \ ArcGIS \ AddIns \ Desktop10 adresindeki AddIn'de değiştirdim. Bu yüzden üzerine yazma değerinin nereden geldiğine dair hiçbir fikrim yok!
tomfumb

Girdi için teşekkür ederiz, ancak Documents \ ArcGIS \ AddIns \ Desktop10.0 \ ..... içindeki .esriAddIn dosyası aslında uygulama her yüklendiğinde ayıklanır, böylece eklenti derleme önbelleğindeki tüm değişiklikler kaybolur.
tomfumb
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.