4

WebサイトをインストールしてIIS仮想ディレクトリを作成する小さなインストーラーアプリを作成したいと思います。このアプリは、Windows XP / Server 2003(IIS 6)およびVista / 2008(IIS 7)で実行する必要があります。

問題は次のとおりです。IIS6の場合はWMI/MetabaseAPIを呼び出してvirtdirを作成し、IIS 7の場合ははるかに優れたAPIであるMicrosoft.Web.Administrationがありますが、そのアセンブリはIIS7システムでのみ使用できます。

素朴なアプローチ:

...
if (OperatingSystem == old)
{
    call metabase API...
}
else
{
    call Microsoft.Web.Administration...
}
...

いいですね。しかし、Microsoft.Web.Administration DLLをロードしようとしているときに、これが古いシステムでクラッシュしないようにするにはどうすればよいですか?または、アセンブリを最初に使用したときに、アセンブリがロードされたばかりですか?アセンブリを呼び出しているメソッドが最初に使用されるのはいつですか?

おそらく、CLR / .NET仕様によってある程度の決定論が保証されていなければ、テストは役に立ちません。

このトピックに関するあなたの経験、ヒント、または解決策を聞くのを本当に楽しみにしています。これまでのところ、Web上でリモートで使用できるものは見つかりませんでした。

4

2 に答える 2

1

アセンブリをロードする必要がある場合とロードしてはならない場合を示す仕様のように、決定的な答えを見つけることができませんでした。しかし、によると

http://msdn.microsoft.com/en-us/magazine/cc163655.aspx(「起動時にロードするモジュールの数を減らす」セクション)

www.informit.com/articles/article.aspx?p=30601&seqNum=5にある本の抜粋(「Essential.NET、ボリュームI:共通言語ランタイム」からの抜粋)。

CLRのJITは、メソッドのコンパイルに必要な場合にのみ、必要なアセンブリをロードします。したがって、Microsoft.Web.Administration ...の使用は、アセンブリがシステムに存在することを確信している場合にのみ呼び出される別のメソッドに移動する必要があります。あれは、

   setup()
   { 
       if ( Operating.System == Old )
          call metabase API
       else
          doIIS7Setup()
   }

   void doIIS7Setup()
   {
     call Microsoft.Web.Administration ....
   }
于 2009-12-22T13:14:54.000 に答える
1

個人的には、JITの組み込みの動作に依存するのではなく、依存関係Microsoft.Web.Administrationを別のアセンブリに完全に移動します。

次に、呼び出し元のアセンブリのどこかに、%systemroot%\inetsrv\Microsoft.Web.Administration.dll存在するかどうかを確認します。もしそうなら、私は管理されたインターフェースを使用していると仮定し、アセンブリを呼び出します。そうでない場合は、メタベースAPIに戻ります。

于 2009-12-22T14:52:03.520 に答える