#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);
}
}