0

プロジェクトにカスタム セクションがあります。次の行は、web.config からの Web API プロジェクトで機能します。

...
  <sectionGroup name="Project.Models">
    <section name="product" type="Project.Models.Configuration.ProductSettings" />
  </sectionGroup>
</configSections>  
<Project.Models>
   <product id="1" />    
</Project.Models>

単体テストを実行すると、次のエラーが発生します。

System.Configuration.ConfigurationErrorsException : Project.Models/product の構成セクション ハンドラの作成中にエラーが発生しました: タイプ 'Project.Models.Configuration.ProductSettings' をアセンブリ 'System.Configuration, Version=4.0.0.0, Culture=neutral' から読み込めませんでした、PublicKeyToken=b03f5f7f11d50a3a'. アセンブリ 'System.Configuration、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b03f5f7f11d50a3a' からタイプ 'Project.Models.Configuration.ProductSettings' を読み込めませんでした。

単体テストの app.config からこれを参照するときにアセンブリ名を指定する必要があるのはなぜですか? これで問題は解決しましたが、なぜ必要なのかわかりません。

<section name="product" type="Project.Models.Configuration.ProductSettings, Project.Models" />
4

1 に答える 1

1

コードを実行するホストによって異なります。

type追加の配管がなければ、Configuration 名前空間の内部の仕組みで、属性が静的メソッドに渡されることがわかりますType.GetType(string typeName)

typeName パラメーターについては、その説明に記載されています。

型が現在実行中のアセンブリまたは Mscorlib.dll にある場合は、その名前空間によって修飾された型名を指定するだけで十分です。

キーパーツは現在組み立て中です。これは、通常のアプリドメインには当てはまらないようです。したがって、単体テストを実行するアプリケーション (VS であると想定しています) には当てはまりません。

一方、ASP.NET Web ホスティングは、HttpConfigurationSystemへの呼び出しを再実装する内部クラスを提供しGetSectionます。従うのは少し難しいですが、内部クラスBuildManagerがすべてのアセンブリをロードし、すべての型を繰り返し処理して、一致するものを見つけるように見えます。

これにより、動作の違いが説明されます。常にアセンブリ名を指定することをお勧めします。Type.GetTypeasp.net シナリオでは、アセンブリ名が type パラメーターに存在する場合、webapp の bin フォルダーにあるすべての dll の読み込みと検査を妨げる呼び出しに短絡します。

于 2015-07-24T23:25:02.393 に答える