Использование ApplicationHost.CreateApplicationHost () для создания сообщения Asp.Net при загрузке сборок из другого места - PullRequest
4 голосов
/ 13 июля 2010

Я пытаюсь использовать CreateApplicationHost для создания хоста приложения Asp.Net для простого веб-сервера, однако я получаю System.IO.FileNotFoundException, когда он пытается создать экземпляр моего объекта сортировки:

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

Я полагаю, что эта ошибка связана с тем, что она не может найти сборку, содержащую класс MyMarshaller - если я помещу эту сборку в каталог bin на PhysicalDir, то все работает нормально, однако я не хочусделать это (я также не хочу помещать свою сборку в GAC).

Есть ли способ, которым я могу контролировать, где CreateApplicationHost ищет мою сборку?(Обратите внимание, что класс MyMarshaller определяется в той же сборке, что и строка кода выше)

Ответы [ 2 ]

4 голосов
/ 20 июля 2010

Короткий ответ: сделать это невозможно, однако источник Кассини обнаружил альтернативное решение.


Обновление

Приведенная выше ссылка больше не работает, однако проект CassiniDev *1011* на CodePlex выглядит довольно близко (возможно, производная работа) и содержит то же решение.

Решение состоит в том, чтобыизбегайте использования 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);
}
0 голосов
/ 13 июля 2010

Как загрузить сборку во время выполнения, которая находится в папке, которая не является папкой bin приложения

Если его нет в GAC или BIN, вам придется использовать Assembly.LoadFrom .

Assembly SampleAssembly;
SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
...