3

Visual Studio 2008 のパブリッシュ (ClickOnce) システムを使用してデプロイされた WinForms アプリケーションがあります。アプリケーションのapp.configファイル内に、次の形式のサード パーティ コンポーネントに必要な構成セクションがあります。

<section name="thirdPartySection"
type="System.Configuration.NameValueSectionHandler" />

したがって、このセクションは appSettings にはなく、次のようになります。

<thirdPartySection >
  <add key="someKey" value="someValue" />
</thirdPartySection >

キーと値のペアが NameValueCollection であることを理解しています。私が直面している問題は、インストールされている環境に基づいて、展開時または実行時に値を変更したいということです(どちらでも構いません)。someValuesomeOtherValue

現在、実行時に他の構成変更をいくつか行っていますが、それらはAppSettingsセクションにあるため、簡単に取得できます。解決策の検索で多くの参照を見つけましたが、直面している NameValueCollection ではなく、カスタム クラスを持つセクションに依存しているようです。

このデータを変更する最良の方法を知っている人はいますか? ConfigurationManager.RefreshSection() を使用したランタイムの変更は、現在のコードにより適していますが、インストール段階でも提案を受け付けています。

編集:これは実行時に機能します。これは、古い構成のオーバーライドを処理していた方法です。

Configuration config = ConfigurationManager.OpenExeConfiguration(
    ConfigurationUserLevel.None);

config.AppSettings.Settings["Main.ConnectionString"].Value = 
    PolicyTrackerInfo.ConnectionString;

config.AppSettings.Settings["Main.linq"].Value = 
    PolicyTrackerInfo.LinqConnectionString;


config.Save(ConfigurationSaveMode.Modified);

ConfigurationManager.RefreshSection("appSettings");

別のセクションでも同じことをしようとしています:

string overwriteXml = config.GetSection("thirdPartySection")
    .SectionInformation.GetRawXml();

XmlDocument xml = new XmlDocument();
xml.LoadXml(overwriteXml);
XmlNode node = xml.SelectSingleNode("thirdPartySection/add");
node.Attributes["value"].Value = PolicyTrackerInfo.OverwriteString;

ここまでは順調ですね。ただし、古い XML を変更したデータに置き換える方法が見つかりません。実行時に可能ですか?

余談ですが、 app.config.deploy ファイルを手動で変更してみました。変更がインストーラーによって検出され、続行を拒否するため、検証エラーが発生します。私は自動デプロイが本当に好きで、以前のオーバーライドはうまく機能しました。

4

3 に答える 3

1

できることの 1 つは、アプリケーション構成ファイルの変更など、追加のセットアップを行う初回実行セクションをコードに追加することです。このセットアップを行う必要があるかどうかを検出するために、サードパーティの構成セクションに、アプリケーションが新しいインストールに属するものとして認識するダミーの値が事前に入力されている場合があります。たとえば、構成ファイルは次のようになります。

<thirdPartySection>
    <add key="someKey" value="#NEEDS_INITIALIZED#" />
</thirdPartySection >

Mainメソッドは次のようになります。

static public void Main(params string[] args)
{
    const string uninitializedValue = "#NEEDS_INITIALIZED#";

    // Load the third-party config section (this assumes it inherits from
    // ConfigurationElementCollection
    var config = ConfigurationManager.OpenExeConfiguration(
        ConfigurationUserLevel.None);
    var section = config.GetSection("thirdPartySection") 
        as NameValueConfigurationCollection;
    var setting = section["someKey"];
    if (setting.Value == uninitializedValue)
    {
        setting.Value = PolicyTrackerInfo.OverwriteString;
        config.Save();
    }
}
于 2010-02-06T19:38:47.960 に答える
1

人々が賛成または反対に投票できるというアイデアを提案するために (この質問に関してタンブルウィード以外のことはあまり見たことがありません)、ここに投稿された手法を使用することを考えています: http://www.devx.com /dotnet/記事/10045

基本的な考え方は、メイン アプリケーションの XCOPY 展開を行うだけの shim アプリケーションを ClickOnce に展開させることです (app.config ファイルを使用していないため、標準の XML 変更手法を使用するだけで完了できます)。

または、このアプリケーションはネットワークから展開されるため、アセンブリをネットワーク上に配置し、アクセス許可システムを操作して、必要なフォルダーとデータベースへのアクセスを許可することもできます。何かご意見は?

于 2010-02-05T20:56:34.080 に答える
0

カスタム インストーラーを作成し、AfterInstall イベントで、上記の XML メカニズムを使用して構成ファイルを変更します。ただし、それが ClickOnce でどのように機能するか、または機能するかどうかはわかりません。

于 2010-02-05T18:23:26.330 に答える