app.settingsのArcMapアドインがapp.configの変更を認識しないのですか?


14

構成ファイルが必要なArcMapアドインを開発しました。単一のApp.Configファイルから構成値を読み取ろうとすると(そして常にnullになります)しばらくすると、アドインはクラスライブラリであるため、ここから値を読み取れず、呼び出し元のアプリケーション(ArcMap)を探していると思いますキーの値を要求するときのの設定ファイル(nullのため)。

これを回避するために、アプリケーションが正常に読み取れるApp.Settingsファイルを使用しました。これを作成するとApp.Configファイルが環境に導入され、Visual Studioは開発中に2つのファイルの同期を維持するようです。

アドインが展開されたので、構成値(ログファイルの場所など)を変更できるようにする必要があります。.esriaddinファイルを開いて展開し、そこでApp.Configファイルを更新しようとしましたが、アドインはコンパイル時と同じ構成値を保持します。新しいApp.Config値は、アーカイブを閉じた後に再び表示できるため、.esriaddinファイルに保持されていることを知っています。

アドインを構成し、展開後にこの構成を更新可能にする信頼できる方法を誰かが知っていますか?これにはカスタム設定ファイルが必要なのはばかげているように思われるので、どんな提案でも大歓迎です。

App.Settingsの値はアプリケーションレベルにあり、現在App.SettingsとApp.Configの両方にビルドアクションがあります:なし/コピーしない。

回答:


8

アドインを構成する方法を見つけました。

ことを唯一の場所ようで...ドキュメント\ ArcGISの\アドイン\ Desktop10.0 ...アドインファイルは、毎回のArcMapの負荷を展開しますANYアドインに組み込まれた設定ファイルを編集することができますが、ここにあります。レジストリキーを使用したり、専用のアドイン構成ディレクトリを使用したりはしませんでした。

最後に、設定にapp.configファイルを使用しました(クラスライブラリで使用した場合でも、configファイルは無視されますが、アセンブリに合わせて名前が変更され、アドインアーカイブに自動的に含まれます)。上記のリンクに基づいて、次の構成クラスを使用しました

...

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

...

アドインが展開された後に構成を編集するには、ArcMapを閉じ、winrarで.esriAddInファイルを開き、\ installに移動して構成ファイルを開き、編集してエディターを閉じ、winrarでファイルを更新する必要がありましたアーカイブ。迷惑なことに、これは最初に試したものの1つですが、winrarがアーカイブを更新したときに構成ファイルのエディターがまだ開いていたため、問題があったと思います。


OpenMappedExeConfigurationで最近エラーに遭遇しましたか?私は同様のアプローチを使用していましたが、ほんの数日前に、おそらくWindows Updateをインストールした後、動作しなくなるまで動作しました。私のこのStackOverflowの質問を参照してください。
blah238

@ blah238私はしばらくこのアドインをテストしていないため、今のところ機会がありません。あなたがまとめることができればしかし、最近のWindows / .NETは、私がもし鉱山(win7の)試合を見て、あなたが知っていることができます更新
tomfumb

関連性があると思われたのは、.NET 4セキュリティアップデートのみでした。それが.NET 3.5にも影響するかどうかはわかりません。
blah238

参考までに、.NET構成システムの代わりに従来のXML(デ)シリアル化を使用するようにアドインの構成ロジックを書き直しました。私が考えた主な目的は、.configファイルが.esriAddinファイルからのアセンブリ-私が知る限り、任意のXMLファイルで行うことはできません-しかし、私の目的のために、デフォルトの構成を提供する必要はなく、永続するだけであると決めましたユーザー固有の設定)。ただし、これが他のアドイン開発者にも影響を与えているかどうかは知りたいです。
blah238

.configアプローチとFusionをもう少し調べてみると、ESRIがAssembly.LoadFrom()を使用してアドインアセンブリをロードしていることがわかります。私が読んだことから、これはアドイン用に別個のAppDomainをセットアップするベストプラクティスに反し、ConfigurationManagerが正しい場所のアセンブリを探す必要がない理由を説明するかもしれません。私が理解していないのは、既定のAppDomainに既に読み込まれているアセンブリを再度検索する必要がある理由です。.NETセキュリティ更新プログラムにより、アセンブリの場所がより頻繁にチェックされるようになったと推測できます。
blah238

6

同様の答えから借りて、あなたはアドインでこれを使用するかもしれません:

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

ヒントをありがとう、上記で作成されたパスは... / addInName.dll / config.xmlを提供するため有効ではありませんが、私は正しい道を歩みました。私は今ややシンプルなものを使用していますthis.GetType().Assembly.Location + ".config"
-tomfumb

2

標準の.NET構成ファイルは、ライブラリごとではなく、アプリケーションごとです。つまり、ArcMapプロセス内でアドインを実行する場合、ArcMap.exe以外に配置する必要があるArcMap.exe.configで構成設定を指定する必要があります。

もちろん、これは実稼働環境で常に可能とは限らず、アドインの分離にも違反します。これは、アドインが最初に導入された理由の1つです。

独自の設定ファイル(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アドインの新しいモデルを見たことはありませんが、他の人が行ったことや見たことは、レジストリのUserHiveのユーザーです。その後、必要な値の候補を更新するための画面をアドインに表示できます。

App.configファイルを使用すると、新しい値を読み取るためにapp / extensionを完全に再起動する必要があります。レジストリからオンザフライで更新する方が簡単です。


0

アドインアセンブリキャッシュにある構成ファイルのコピーを変更することができます。esriaddinは、ArcGISによって一度だけ展開されると思います。したがって、後続の変更は使用されない場合があります(esriaddinファイルはキャッシュよりも新しいことに注意してください)。

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

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


興味深い提案ですが、残念ながら違いはありませんでした。ArcMapの起動時にAssemblyCacheディレクトリの構成ファイルが上書きされます。 0なので、上書きの値がどこから来るのかわかりません!
-tomfumb

入力を評価しますが、アプリケーションがロードされるたびにDocuments \ ArcGIS \ AddIns \ Desktop10.0 \ .....にある.esriAddInファイルが実際に抽出されるため、アドインアセンブリキャッシュのすべての変更が失われます。
-tomfumb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.