Как создать домен приложения и запустить в нем свое приложение?
2 ответа
Вероятно, следует отметить, что создание доменов приложений только для того, чтобы обойти что-то, что можно исправить с помощью постоянной строки, вероятно, является неправильным способом сделать это. Если вы пытаетесь сделать то же самое, что и указанную вами ссылку, вы можете просто сделать это:
var configFile = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(configFile))
throw new Exception("do your worst!");
Рекурсивная точка входа: о)
static void Main(string[] args)
{
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
var currentAssembly = Assembly.GetExecutingAssembly();
var otherDomain = AppDomain.CreateDomain("other domain");
var ret = otherDomain.ExecuteAssemblyByName(currentAssembly.FullName, args);
Environment.ExitCode = ret;
return;
}
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("Hello");
}
Быстрый пример с использованием нестатической вторичной точки входа и MarshalByRefObject...
class Program
{
static AppDomain otherDomain;
static void Main(string[] args)
{
otherDomain = AppDomain.CreateDomain("other domain");
var otherType = typeof(OtherProgram);
var obj = otherDomain.CreateInstanceAndUnwrap(
otherType.Assembly.FullName,
otherType.FullName) as OtherProgram;
args = new[] { "hello", "world" };
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
obj.Main(args);
}
}
public class OtherProgram : MarshalByRefObject
{
public void Main(string[] args)
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
foreach (var item in args)
Console.WriteLine(item);
}
}
Вам нужно:
1) Создайте экземпляр объекта AppDomainSetup и заполните его информацией о настройке, которую вы хотите для своего домена
2) Создайте новый домен с помощью метода AppDomain.CreateDoman. Экземпляр AppDomainSetup с параметрами конфигурации передается методу CreateDomain.
3) Создайте экземпляр вашего объекта в новом домене, используя метод CreateInstanceAndUnwrap для объекта домена. Этот метод получает имя типа объекта, который вы хотите создать, и возвращает удаленный прокси-сервер, который вы можете использовать в основном домене для связи с объектом, созданным в новом.
Выполнив эти 3 шага, вы можете вызывать методы в другом домене через прокси. Вы также можете выгрузить домен после того, как закончите, и перезагрузить его снова.
Эта тема в справке MSDN содержит довольно подробный пример того, что вам нужно