3

ConfigurationManager.AppSettings独自のファイルを持つMEFプラグインからオブジェクトの値にアクセスしたいと思いapp.configます。

ただし、プラグインがロードされた後、app.configファイルのキーはに存在しません。AppSettingsプラグインをロードするアプリケーションからのキーはまだ存在しています。

Settings.settingsファイルを使用すると、ファイルを介してこの動作が可能app.configになるため、ファイルを何らかの方法でロードする必要があることに気付きました。

私のプラグインは次のようになります:

[Export(IPlugin)]
public class Plugin
{
    public Plugin()
    {
        // reads successfully from app.config via Settings object
        var value1 = Settings.Default["Key1"];

        // returns null from app.config via ConfigurationManager
        var value1 = ConfigurationManager.AppSettings["Key2"]
    }
}

このapp.configように見えます:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="..." >
      <section name="Plugin.Settings" type="..." />
    </sectionGroup>
  </configSections>

  <appSettings>
    <add key="Key2" value="Fails" />
  </appSettings>

  <applicationSettings>
    <Plugin.Settings>
      <setting name="Key1" serializeAs="String">
        <value>Works</value>
      </setting>
    </Plugin.Settings>
  </applicationSettings>
</configuration>

app.config次のコマンドでファイルを手動でロードできます。

var config = ConfigurationManager.OpenExeConfiguration("Plugin.dll");
var value = AppSettings.Settings["Key2"].Value

しかし、これは解決策というよりは回避策のようです。

<appSettings>プラグイン内からMEFプラグインに直接アクセスする方法はありますか?そうでない場合、何が推奨されますか?

4

2 に答える 2

9

デフォルトでは、ConfigurationManager はエントリ アセンブリ、つまり現在実行中のプロセスを開始したアセンブリの .config を読み込みます。

これを行う正しい方法は次のようになります。

[Export(IPlugin)]
public class Plugin
{
    public Plugin()
    {
        var config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
        var value = config.AppSettings.Settings["Key2"].Value;
    }
}

これにより、プラグインはコンパイルされた DLL の .config を自動的に開き、そこから値をフェッチします。

于 2012-10-22T09:11:03.950 に答える
2

必要な構成をプラグインに提供するために、Unity などの依存性注入ツールを使用することをお勧めします。この方法で進めると、プラグインは System.Configuration.dll を参照する必要がなくなります。

于 2012-10-22T08:26:43.677 に答える