. NET Core +. NET 4 При параллельном выполнении процесса? - PullRequest
7 голосов
/ 27 февраля 2020

Работает на Windows, делает. NET Поддержка основного процесса при параллельном выполнении процесса. NET 4, как описано здесь: https://docs.microsoft.com/en-us/dotnet/framework/deployment/in-process-side-by-side-execution

Спасибо

1 Ответ

3 голосов
/ 07 апреля 2020

Если вы ищете «бок о бок» в соответствии с указанными документами:

Установка новой версии. NET Framework не влияет на существующие приложения.

Приложения работают с версией. NET Framework, с которой они были созданы. Они не используют новую версию. NET Framework, если не указано иное. Однако приложениям проще перейти на использование новой версии. NET Framework.

Тогда ответ будет Нет .

. NET Core - это независимая платформа, а не обновление. NET Framework. Поэтому запускать обе библиотеки DLL в одном процессе параллельно по вышеуказанным причинам не имеет значения.

Есть ли способ разместить одну. NET Framework DLL и одну. NET Core DLL в том же процессе?

Да.

Я видел два вида возможных способов:

w3wp.exe

При использовании внутрипроцессного хостинга , возможно загрузить CLR и CoreCLR в w3wp.exe, но как это работает, я не знаю , Это должна быть вещь низкого уровня / уровня времени выполнения, которая находится за пределами мира управляемого кода.

Ссылка на DLL

A. NET Базовое приложение может напрямую ссылаться на библиотеку. NET Framework до тех пор, пока нацеливается . NET Framework Версия реализует. NET Стандарт . например, NET45 +.

Однако код. NET Framework может работать по-разному, когда он в. NET Оболочка ядра, чем в. NET Оболочка Framework.

Учтите это код:

// In .NET Framework library
public class Class1
{
    public void Test()
    {
        var domain = AppDomain.CreateDomain("mydomain");
        Console.WriteLine(domain);
    }
}

Если вы ссылаетесь на этот тип в базовом приложении. NET, вы можете увидеть предупреждение , но без ошибки времени компиляции:

static void Main(string[] args)
{
    var class1 = new Class1();
    class1.Test();
}

Когда вы запустите код, вы получите исключение:

System.PlatformNotSupportedException: 'Secondary AppDomains are not supported on this platform.'

И наоборот, когда вы запустите код в оболочке. NET Framework, вы увидите нормальный вывод:

Name:mydomain
There are no context policies.

Почему?

Это связано с тем, что AppDomain является типом, перенаправленным в разные библиотеки времени выполнения.

Если вы распечатываете сборку, в которой находится тип:

Console.WriteLine(typeof(AppDomain).Assembly);

Вы можете видеть для. NET Core, вывод:

System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e

, тогда как для. NET Framework, вывод:

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

какой тип связи между ними может быть?

можно ли, например, отправлять сериализованные объекты? Что-то похожее в том, как могут взаимодействовать два домена приложений?

Согласно этой документации , домены приложений и удаленное взаимодействие не поддерживаются. NET Core, поэтому вы не можете выполнять кросс -доменная связь, основанная на этих технологиях.

Если вы посмотрите на реализацию MarshalByRefObject in. NET Core, то выдает только исключения.

Однако, сетевые коммуникации (такие как gPP C) все еще возможны.

...