Создание оболочки над установкой и удалением AppDomain

using System;
using System.IO;
using System.Reflection;
using System.Text;
using MyApp.Logging;

namespace MyApp.SmsService.Common
{
    public class MyAppAppDomain:MarshalByRefObject
    {
        private readonly AppDomainSetup domaininfo;
        private readonly AppDomain appDomain;
        public static string libDllPath;

        public MyAppAppDomain(string appDomainName) //Constructor
        {
            //Setup the App Domain Parameters
            domaininfo = new AppDomainSetup();
            domaininfo.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
            domaininfo.DisallowBindingRedirects = false;
            domaininfo.DisallowCodeDownload = true;
            domaininfo.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

            // Create the application domain.
            appDomain = AppDomain.CreateDomain(appDomainName, null, domaininfo);

            //Set the dll path using Static class ref.

            //Dependency resolution handler
            appDomain.AssemblyResolve += LoadFromLibFolder; /*Exception*/
        }

        private static Assembly LoadFromLibFolder(object sender, ResolveEventArgs args)
        {

            if (libDllPath != null)
            {
                string assemblyPath = Path.Combine(libDllPath, new AssemblyName(args.Name).Name + ".dll");

                if (File.Exists(assemblyPath) == false)
                {
                    return null;
                }
                Assembly assembly = Assembly.LoadFrom(assemblyPath);
                //Assembly dependancy resolved.

                return assembly;
            }

            return null;
        }

        public Object getNewInstanceOf(string fullyQualifiedTypeName)
        {
            return appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, fullyQualifiedTypeName);
        }

        public Type getTypeOf(string fullyQualifiedTypeName)
        {
            return getNewInstanceOf(fullyQualifiedTypeName).GetType();
        }

        public void unloadDomain()
        {
            AppDomain.Unload(appDomain);
        }
    }
}

Приведенный выше класс представляет собой оболочку, которую я хочу создать для установки и удаления домена приложения. Однако в моем веб-сервисе я получаю FileNotFoundException [Не удалось загрузить dll xyz.dll] всякий раз, когда я создаю экземпляр объекта MyAppAppDomain.

Ниже приводится бывший:

MyAppAppDomain.libDllPath = appDllLibPath; //Some directory other than bin.
pluginDomain = new MyAppAppDomain("SmsServicePlugins"); //Throws FileNotFoundException.

При отладке я вижу, что строка, вызвавшая исключение, отмечена выше как /exception/ внутри конструктора MyAppAppDomain.

Что происходит не так?

ИЗМЕНИТЬ:

Я просматривал другие статьи и прочитал, что объекты не могут быть видны в разных доменах. Это может произойти только в том случае, если объект может быть сериализован в обоих доменах (использование MarshalByRefObject), а затем доступен через прокси.

Было бы очень полезно, если бы кто-то мог указать на проблемы в приведенном выше коде. Тем временем я пытаюсь узнать больше о Marshalling и Proxy-ing.


person Cik    schedule 13.06.2012    source источник


Ответы (1)


Первая проблема заключается в том, что вы пытаетесь сделать все внутри оболочки домена приложения, на самом деле это два разных компонента. Первый компонент, который вам нужен, — это ваш объект, который вы хотите создать внутри своего нового домена приложения, который наследуется от MarshalByRefObject (или помечен как Serializable). Другой живет внутри вашего текущего AppDomain и используется для создания нового AppDomain.

Взгляните на пример msdn, чтобы понять, что я имею в виду.

Однако ваша ошибка, вероятно, более чем вероятна в том, что ваш путь к вашей DLL неверен. Не могли бы вы показать полную трассировку стека, чтобы показать, какая строка вызывает исключение?

person Bronumski    schedule 14.06.2012