Как создать домен приложения и запустить в нем свое приложение? - PullRequest
23 голосов
/ 15 апреля 2010

Мне нужно создать собственный домен приложения, чтобы обойти ошибку в поведении по умолчанию во время выполнения .NET . Ни один из примеров кода, который я видел в Интернете, не является полезным, поскольку я не знаю, где его разместить или что нужно заменить в моем методе Main().

Ответы [ 2 ]

39 голосов
/ 16 апреля 2010

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

var configFile = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(configFile))
    throw new Exception("do your worst!");

Рекурсивная точка входа : o)

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);
    }
}
6 голосов
/ 15 апреля 2010

Вам необходимо:

1) Создайте экземпляр объекта AppDomainSetup и заполните его информацией о настройке, необходимой для вашего домена

2) Создайте новый домен с помощью метода AppDomain.CreateDoman. Экземпляр AppDomainSetup с параметрами конфигурации передается методу CreateDomain.

3) Создайте экземпляр вашего объекта в новом домене с помощью метода CreateInstanceAndUnwrap для объекта домена. Этот метод получает имя типа объекта, который вы хотите создать, и возвращает удаленный прокси, который вы можете использовать в основном домене для связи с объектом, созданным в новом

Выполнив эти 3 шага, вы можете вызывать методы в другом домене через прокси. Вы также можете выгрузить домен после завершения и перезагрузить его снова.

Эта тема в справке MSDN содержит довольно подробный пример того, что вам нужно

...