Встраивание dll в HttpHandler с использованием встроенных ресурсов - PullRequest
0 голосов
/ 30 января 2012

Я хотел бы встроить DLL зависимостей в мою библиотеку HttpHandler для более простого развертывания, поэтому я подумал добавить ее в решение как встроенный ресурс и использовать событие AppDomain.CurrentDomain.AssemblyResolve для его решения.
Проблема в том, что если я подпишуськ событию в методе void ProcessRequest(HttpContext context), похоже, что он не может разрешиться до того, как достигнет подписки на событие.
Поэтому вопрос заключается в том, где мне подписаться на это событие, чтобы иметь возможность загружать dll из встроенного ресурса.

1 Ответ

1 голос
/ 30 января 2012

Вы можете использовать статический конструктор вашего обработчика.Например:

public class Handler1: IHttpHandler
{
    static Handler1()
    {
        AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
        {
            if (string.Equals(e.Name, "ClassLibrary1", StringComparison.OrdinalIgnoreCase))
            {
                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Handler.ClassLibrary1.dll"))
                {
                    var buffer = new byte[stream.Length];
                    stream.Read(buffer, 0, buffer.Length);
                    return Assembly.Load(buffer);
                }
            }
            return null;
        };
    }

    public void ProcessRequest(HttpContext context)
    {
        var mtd = Type.GetType("ClassLibrary1.Class1, ClassLibrary1").GetMethod("Hello", BindingFlags.Static | BindingFlags.Public);
        var result = (string)mtd.Invoke(null, null);
        context.Response.ContentType = "text/plain";
        context.Response.Write(result);
    }

    public bool IsReusable
    {
        get { return true; }
    }
}
...