4

CreateApplicationHostを使用して単純な Web サーバー用の Asp.Net アプリケーション ホストをSystem.IO.FileNotFoundException作成しようとしていますが、マーシャリング オブジェクトのインスタンスを作成しようとすると、次のようになります。

host = (MyMarshaller)ApplicationHost.CreateApplicationHost((MyMarshaller), virtualDir, physicalDir);

このエラーは、クラス MyMarshaller を含むアセンブリが見つからないことが原因であると考えています。このアセンブリを physicalDir の bin ディレクトリに配置すると、すべて正常に動作しますが、これを実行したくありません (私も実行したくありません)。アセンブリを GAC に配置します)。

CreateApplicationHost がアセンブリを検索する場所を制御できる方法はありますか? (MyMarshallerクラスは上記のコード行と同じアセンブリに含まれていることに注意してください)

4

1 に答える 1

5

簡単に言えば、これを行うことは不可能ですが、カッシーニの情報源は別の解決策を明らかにしました。


アップデート

上記のリンクは機能しなくなりましたが、CodePlex のCassiniDev プロジェクトはかなり近いようで (おそらく派生作品)、同じソリューションが含まれています。

解決策は、使用を避け、CreateApplicationHost代わりに「自分でやる」ことです。この場合、リフレクションを使用して内部の「BuildManagerHost」タイプのインスタンスを作成し、「RegisterAssembly」を呼び出します。

/// <remarks>
/// This is Dmitry's hack to enable running outside of GAC.
/// There are some errors being thrown when running in proc
/// </remarks>
private object CreateWorkerAppDomainWithHost(string virtualPath, string physicalPath, Type hostType,int port)
{
    // create BuildManagerHost in the worker app domain
    //ApplicationManager appManager = ApplicationManager.GetApplicationManager();
    Type buildManagerHostType = typeof(HttpRuntime).Assembly.GetType("System.Web.Compilation.BuildManagerHost");
    IRegisteredObject buildManagerHost = ApplicationManager.CreateObject(_appId, buildManagerHostType, virtualPath,
                                                                  physicalPath, false);

    // call BuildManagerHost.RegisterAssembly to make Host type loadable in the worker app domain
    buildManagerHostType.InvokeMember("RegisterAssembly",
                                      BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic,
                                      null,
                                      buildManagerHost,
                                      new object[] { hostType.Assembly.FullName, hostType.Assembly.Location });

    // create Host in the worker app domain
    // FIXME: getting FileLoadException Could not load file or assembly 'WebDev.WebServer20, Version=4.0.1.6, Culture=neutral, PublicKeyToken=f7f6e0b4240c7c27' or one of its dependencies. Failed to grant permission to execute. (Exception from HRESULT: 0x80131418)
    // when running dnoa 3.4 samples - webdev is registering trust somewhere that we are not
    return ApplicationManager.CreateObject(_appId, hostType, virtualPath, physicalPath, false);
}
于 2010-07-20T13:45:04.973 に答える