Попытка создать домен приложения экземпляра

#c# #applicationdomain

#c# #область применения #applicationdomain

Вопрос:

Я пытаюсь сделать следующее :

 private static MyClass CreateMyClassInDomain(ApplicationDomain domain, string componentName, params object[] parmeters)
{
   var componentPath =  Assembly.GetAssembly(typeof(MyClass)).CodeBase.Substring(8).Replace("/", @"");
   ObjectHandle inst = Activator.CreateInstanceFrom(domain, componentPath, "MyNsp."   componentName, true, BindingFlags.Default, null,
            parmeters, null, null);

   return (MyClass)inst.Unwrap();
}
  

Есть ли что-то, что я делаю не так? Я создаю успешно, но после того, как я пытаюсь использовать экземпляр MyClass в некоторых случаях, у меня возникает неожиданное исключение.

Отредактировано: Найден источник проблемы. я использовал dll, загруженную в текущий домен приложения, для создания экземпляра в другом домене приложения, и это вызвало несогласованность

Спасибо.

Комментарии:

1. Что является исключением? и какое исключение вы ожидаете? 🙂

2. И что это за неожиданное исключение?

Ответ №1:

Проверьте пример кода, чтобы загрузить объект в другом домене и выполнить работу.

Вы можете загрузить объект в другой объект, только если на этот компонент dll есть ссылка в приложении.

Если на него нет ссылки, перейдите к размышлению.

 namespace MyAppDomain
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create an ordinary instance in the current AppDomain
            Worker localWorker = new Worker();
            localWorker.PrintDomain();

            // Create a new application domain, create an instance 
            // of Worker in the application domain, and execute code
            // there.
            AppDomain ad = AppDomain.CreateDomain("New domain");
            ad.DomainUnload  = ad_DomainUnload;
            //ad.ExecuteAssembly("CustomSerialization.exe");

            Worker remoteWorker = (Worker)ad.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "MyAppDomain.Worker");

            remoteWorker.PrintDomain();

            AppDomain.Unload(ad);
        }


        static void ad_DomainUnload(object sender, EventArgs e) 
        { 
            Console.WriteLine("unloaded, press Enter"); 
        } 

    }
}

public class Worker : MarshalByRefObject
{
    public void PrintDomain()
    {
        Console.WriteLine("Object is executing in AppDomain "{0}"", AppDomain.CurrentDomain.FriendlyName);
    }
}