XmlSerializer を利用して構成セクションを読み込む

XmlSerializer を利用した実装例は、頂いているトラックバックにある id:aoki1210:20050523 から紹介されているもう1つの記事 http://codezine.jp/a/article.aspx?aid=76 で十分だろうから省略するが、記事の内容をそのまま利用される場合は1点注意しなければならないことがあるので、ちょっと書いておく。
記事のカスタムセクションハンドラは、section タグの type 属性で指定されたクラスを無条件にデシリアライズしてしまうという点は、それなりに危険であるので実装方法の勉強に使うのみにとどめ、そのまま実用してはならない。あくまで技術的な手法の紹介であって、そのまま利用すると任意のアセンブリの任意のコードをアプリケーション上で実行させることが可能である。たとえば、

namespace MyCode
{
  public class TestCode
  {
    public class TestCode() {}

    public string Message
    {
      get { return "Hello."; }
      set
      {
        System.Windows.Forms.MessageBox.Show(value);
        System.Windows.Forms.Application.Exit(0);
      }
    }
  }
}

というようなクラスを生成して、MyCode.dll を作成して、次のように構成ファイルを修正する。

  <!-- xxx は実際にアプリケーションが読み込む名称のまま -->
  <configSections>
    <section name="xxx" type="MyCode.TestCode, MyCode" />
  </configSections>
  <xxx>
    <Message>Goodbye !</Message>
  </xxx>

当然、アプリケーションは MyCode.dll を自動的に読み込み、MyCode.TestCode クラスのインスタンスを生成し、Message プロパティに Goodbye ! という文字列を設定するので、画面にメッセージボックスが表示され、アプリケーションは終了することになる。


まあ、こんなこと、ちゃんと内容を読んでる人なら言われなくてもわかってるよね?