6

mvc.razor ジェネレーターですべてが正常に動作します。私のライブラリ プロジェクトからのビューは、私の Web サイトに問題なく表示されます。.net 4.0、MVC4、EF5 プロジェクトです。アプリケーション プールは、IIS で .net 4.0 に設定されています。

サーバーにデプロイすると、PrecompiledMvc​​Engine タイプをロードしようとすると例外が発生します。ここに例外があります(添付ファイルにエラーの完全な出力を添付しました):

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 


[ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.]
System.Reflection.RuntimeModule.GetTypes(RuntimeModule module) +0
System.Reflection.Assembly.GetTypes() +159
RazorGenerator.Mvc.PrecompiledMvcEngine..ctor(Assembly assembly, String baseVirtualPath) +1209
RazorGenerator.Mvc.PrecompiledMvcEngine..ctor(Assembly assembly) +53
MyProj.Common.App_Start.RazorGeneratorMvcStart.Start() in E:\UserFiles\sheam\Documents\Visual Studio 2010\Projects\MyProj\Project.Common_vs2010\App_Start\RazorGeneratorMvcStart.cs:11

ご覧のとおり、これは私の共通プロジェクトからのものです。

bin ディレクターの内容は次のとおりです。

2012-10-17 09:06 PM <DIR> .
2012-10-17 09:06 PM <DIR> ..
2012-10-10 12:51 AM 105,528 Antlr3.Runtime.dll
2012-10-09 07:05 PM 1,118,296 EntityFramework.dll
2012-10-16 01:26 PM 359,424 MyProj.Common_vs2010.dll
2012-10-16 01:26 PM 112,128 MyProj.Common_vs2010.pdb
2012-10-09 06:46 PM 45,416 Microsoft.Web.Infrastructure.dll
2012-10-17 09:06 PM 29,696 MyProj.dll
2012-10-17 09:06 PM 42,496 MyProj.pdb
2012-10-13 08:04 PM 15,872 Mvc.Mailer.dll
2012-10-09 06:46 PM 374,784 Newtonsoft.Json.dll
2012-10-09 06:56 PM 15,872 RazorGenerator.Mvc.dll
2012-10-09 06:46 PM 180,832 System.Net.Http.dll
2012-10-09 06:46 PM 168,544 System.Net.Http.Formatting.dll
2012-10-09 06:46 PM 16,480 System.Net.Http.WebRequest.dll
2012-10-09 06:46 PM 138,328 System.Web.Helpers.dll
2012-10-09 06:46 PM 323,168 System.Web.Http.dll
2012-10-09 06:46 PM 73,312 System.Web.Http.WebHost.dll
2012-10-09 06:46 PM 506,976 System.Web.Mvc.dll
2012-10-10 12:51 AM 54,912 System.Web.Optimization.dll
2012-10-09 06:46 PM 264,792 System.Web.Razor.dll
2012-10-09 06:46 PM 41,048 System.Web.WebPages.Deployment.dll
2012-10-09 06:46 PM 204,376 System.Web.WebPages.dll
2012-10-09 06:46 PM 39,512 System.Web.WebPages.Razor.dll
2012-10-09 06:56 PM 8,704 WebActivator.dll
2012-10-10 12:51 AM 963,640 WebGrease.dll
24 File(s) 5,204,136 bytes
2 Dir(s) 1,519,661,289,472 bytes free

そこに RazorGenerator.Mvc.dll が存在するため、型を読み込めない理由がわかりません。

W7 Proの場合、サーバーは新規インストールです。

4

1 に答える 1

11

問題だったのは実際にはカミソリ発生器ではなかったことが判明しました。問題は、RG がリフレクションを介してロードしていたクラスに正しいアセンブリがないことでした。それは 2 つの Webmatrix アセンブリでした。

コピー ローカルが (ライブラリ プロジェクトで) 設定されていても、ビルド マシンの GAC に存在する場合、Visual Studio 2010 および 2012 は実際にはそれをコピーしません。私の場合、ビルド マシンにはそのアセンブリが (MVC3 によって) インストールされていましたが、Web サーバーにはインストールされていませんでした。最終的に、これらのアセンブリを Web プロジェクト (ライブラリではなく) に追加し、そこにローカルにコピーを設定しました。

これは厄介なバグです。この問題が再び発生した場合にすぐに指摘する特別な例外ハンドラーを作成します。RazorGeneratorMvcStart の Start() 関数は次のようになります。

public static void Start() 
{
    PrecompiledMvcEngine engine = null;
    try
    {
        engine = new PrecompiledMvcEngine(typeof(RazorGeneratorMvcStart).Assembly)
        {
            UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal
        };
    }
    catch (System.Reflection.ReflectionTypeLoadException e)
    {
        StringBuilder exceptions = new StringBuilder("The following DLL load exceptions occurred:");
        foreach (var x in e.LoaderExceptions)
          exceptions.AppendFormat("{0},\n\n", x.Message);
        throw new Exception(string.Format("Error loading Razor Generator Stuff:\n{0}",exceptions));
    }

    ViewEngines.Engines.Insert(0, engine as PrecompiledMvcEngine);

    // StartPage lookups are done by WebPages. 
    VirtualPathFactoryManager.RegisterVirtualPathFactory(engine as PrecompiledMvcEngine);
}

見栄えは良くありませんが、見栄えを良くして後で再利用できるようにする方法を考えます。:)

于 2012-10-20T18:34:02.987 に答える