Как использовать AppDomain.CreateDomain с AssemblyResolve? - PullRequest
3 голосов
/ 15 марта 2012

Я хочу загрузить свои сборки из WCF, используя память.Все работает хорошо, КОГДА:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Assembly[] assBefore = AppDomain.CurrentDomain.GetAssemblies();
foreach (byte[] binary in deCompressBinaries)
    loadedAssembly = AppDomain.CurrentDomain.Load(binary);

Но я хочу использовать AppDomain.CreateDomain, а не текущий домен:

protected void LoadApplication()
{
    this.ApplicationHost = AppDomain.CreateDomain("TestService", null, new AppDomainSetup
    {
        ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
    });

    ApplicationHost.AssemblyResolve += new ResolveEventHandler(OnAssemblyResolve);
    foreach (AssemblyName asmbly in System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies())
    {
        ApplicationHost.Load(asmbly);
    }
    List<byte[]> deCompressBinaries = new List<byte[]>();
    foreach (var item in AppPackage.Item.AssemblyPackage)
        deCompressBinaries.Add(item.Buffer);
    var decompressvalues =  DeCompress(deCompressBinaries);
    deCompressBinaries.Clear();
    deCompressBinaries = decompressvalues.ToList();

    foreach (byte[] binary in deCompressBinaries)
        ApplicationHost.Load(binary);

    Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies();
}

Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
    return Assembly.Load(args.Name);
}

У меня есть две библиотеки классов, ClassLibrary1 и ClassLibrary2, используя приведенные ниже:

namespace ClassLibrary2
{
    public class Class1 : MarshalByRefObject
    {
        public Class1()
        {

        }

        public int GetSum(int a , int b)
        {
            try
            {
                ClassLibrary1.Class1 ctx = new ClassLibrary1.Class1();
                return ctx.Sum(a, b);
            }
            catch
            {
                return -1;
            }
        }

        public int GetMultiply(int a, int b)
        {
            return a * b;
        }
    }
}

Classlibrary2 зависит от ClassLibrary1.Поэтому я использую Assemblyresolver.Но я получаю сообщение об ошибке ApplicationHost.Load (двоичный файл); :

Ошибка: Не удалось загрузить файл или сборку 'ClassLibrary1, Версия = 1.0.0.0, Культура= нейтральный, PublicKeyToken = null 'или одна из его зависимостей.Система не может найти указанный файл.

Кроме того, это НЕ FIRING ASSEMBLYRESOLVER.Мой курсор не идет к методу Assemblyresolver.Как использовать AppDomain.CreateDomain с методом разрешения?

1 Ответ

0 голосов
/ 16 марта 2012

Мне лично не нравится загрузка сборок из байтового массива. Я думаю, что лучше сохранить ваши сборки во временную папку, а затем загрузить их из этой папки. Взгляните на эту статью: Домены приложений сложны… .

...