4

RazorEngine を使用して、MVC のコンテキスト外のサービス レイヤーでテンプレートを実行しています。これらのアセンブリのクラスがビューでのみ使用されている場合、アセンブリが AppDomain に読み込まれないという問題があります。詳しく説明しましょう。

スタンドアロン アセンブリに埋め込まれたリソースである Razor テンプレートがいくつかあります (アセンブリ A と呼びましょう)。

テンプレートの 1 つ ( )は、別のアセンブリ (アセンブリ B と呼びましょう) に存在MyTemplateするユーティリティ クラス ( ) を使用します。MyHelperClass

アセンブリ A には、アセンブリ B へのハード参照があります。

参照するテンプレートを解析しようとするとMyHelperClass、「using ディレクティブまたはアセンブリ名前空間が不足していますか?」というおなじみのメッセージが表示されます。デバッグして Visual Studio のモジュール ウィンドウを見ると、アセンブリ B が AppDomain に読み込まれていないことがわかります。コードをデバッグし、失敗したコード行の前に中間ウィンドウを介してアセンブリをロードすると、機能します。

したがって、単にビューで使用されるだけでは、.NET フレームワークがアセンブリを AppDomain に読み込むには十分ではないようです。私はこれをテストしていませんが、これは標準の MVC プロジェクトにも当てはまると思います。

本当に2つの質問。

  1. ビュー内の参照は、ランタイムにアセンブリをロードさせるのに十分ではありませんか?
  2. Assembly.Loadこの状況で、ダミー クラスに頼ったり参照したりせずに、このアセンブリを強制的に読み込む最善の方法は何ですか。
4

2 に答える 2

4

最終的に、これらのテンプレートのランタイム コンパイルは脆弱すぎると判断し、将来この問題が発生する可能性があることに非常に不安を感じました。代わりに、RazorGenerator NuGet パッケージを使用するようにプロジェクトを変更し、ビューをプリコンパイルして実行時の驚きを回避することにしました。

于 2013-03-14T11:28:14.943 に答える
1

MyHelperClassweb.configでの名前空間を宣言します。

<configSections>
  <section name="razorEngine" type="RazorEngine.Configuration.RazorEngineConfigurationSection, RazorEngine" requirePermission="false" />
</configSections>
<razorEngine>
  <namespaces>
    <add namespace="..." />
  </namespaces>
</razorEngine>
于 2013-03-07T14:36:34.077 に答える