Как типы могут быть одновременно равными и неравными в C#? (.NET 8.0, Linux, собственный хост .NET)C#

Место общения программистов C#
Ответить
Anonymous
 Как типы могут быть одновременно равными и неравными в C#? (.NET 8.0, Linux, собственный хост .NET)

Сообщение Anonymous »

  • ОС: Ubuntu 24.04 Linux
  • Рамка: .NET 8.0.10
  • IDE: Rider (последняя версия)
Я создаю пользовательский хост .NET на основе собственного проекта Linux для запуска управляемого кода.
Проблема в том, что я получаю логическое объяснение. противоречие при сравнении типов примерно в 50% случаев. Проблема воспроизводима на 100 % и возникает только в Linux и при использовании специального хоста .NET.
Это также влияет на выполнение метода GetCustomAttributes, который не может найти атрибуты. в таких случаях. Отладка привела меня к ситуации, видимой на скриншоте, когда типы не совпадают, но когда я сравниваю их в отладчике (см. переменную watch), они совпадают.
Изображение

Точно тот же код работает хорошо (может соответствовать всем типам), если я запускайте управляемый код непосредственно в консоли исполняемый файл без специального хоста .NET.
Я следовал инструкциям Microsoft, чтобы написать собственный хост .NET:
https://learn.microsoft.com/en-us/ dotnet/core/tutorials/netcore-hosting
Помимо вышеуказанной проблемы, хост .NET работает хорошо, может загружать все сборки, и весь остальной код работает нормально.
  • Это не проблема отладчика, поскольку проблема также затрагивает GetCustomAttributes (метод стандартной библиотеки).
  • Я проверил все проекты и зависимости, они хорошие. Nullable отключен во всех проектах и ​​выбран C# 11. У меня есть только библиотечные проекты.
  • Сгенерированный IL-код выглядит так, как и следовало ожидать.
  • ОБНОВЛЕНИЕ: оно оказалось ложным: Ни одна сборка не загружается дважды.
Что мне здесь не хватает? Неправильно настроен хост .NET? Как-то дважды загружать объект Typo? Ошибка CLR или JIT?
Обновления:
  • Я проверил расположение сборки на обоих типах объектов одинаковое.
  • Это намек на то, что типы действительно различаются:

Код: Выделить всё

type.GetHashCode() = {int} 18014707
stopAtType.GetHashCode() = {int} 59387592
  • Связано: https://github.com/dotnet/runtime/issues/39783
  • Подтверждено, что затронутая проблема сборка загружается дважды (панель «Вывод отладки Rider»):

Код: Выделить всё

Loaded Assembly '/home/viktor/se-dotnet-server-local/SpaceEngineersDedicated/bin/Debug/net8.0/Sandbox.Game.dll'
Loading module /home/viktor/se-dotnet-server-local/SpaceEngineersDedicated/bin/Debug/net8.0/Sandbox.Game.dll in application domain 1:clr_libhost
Symbols for module /home/viktor/se-dotnet-server-local/SpaceEngineersDedicated/bin/Debug/net8.0/Sandbox.Game.dll loaded
...
Loaded Assembly '/home/viktor/se-dotnet-server-local/SpaceEngineersDedicated/bin/Debug/net8.0/Sandbox.Game.dll'
Loading module /home/viktor/se-dotnet-server-local/SpaceEngineersDedicated/bin/Debug/net8.0/Sandbox.Game.dll in application domain 1:clr_libhost
Symbols for module /home/viktor/se-dotnet-server-local/SpaceEngineersDedicated/bin/Debug/net8.0/Sandbox.Game.dll loaded
Экземпляры AssemblyLoadContext напечатаны в верхней части Main:

Код: Выделить всё

foreach (var assemblyLoadContext in AssemblyLoadContext.All)
{
Console.WriteLine($"AssemblyLoadContext: {assemblyLoadContext.Name}");
}
Console.WriteLine($"AssemblyLoadContext.Default: {AssemblyLoadContext.Default.Name}");
Непосредственный запуск (без специального хоста .NET):

Код: Выделить всё

AssemblyLoadContext: Default
AssemblyLoadContext.Default: Default
Запуск через собственный хост .NET:

Код: Выделить всё

AssemblyLoadContext: IsolatedComponentLoadContext(/home/viktor/se-dotnet-server-local/SpaceEngineersDedicated/bin/Debug/net8.0/SpaceEngineersDedicated.dll)
AssemblyLoadContext: Default
AssemblyLoadContext.Default: Default
Это должно объяснить проблему.
Код
Суть с соответствующий код C++ хоста .NET: https://gist.github.com/viktor-ferenczi ... a89e2994a4
Gist с используемой конфигурацией среды выполнения: https://gist.github.com/viktor-ferenczi ... 70ddd54983
Функция RunManagedCode вызывается с соответствующими значениями. Управляемый код запускается, поэтому переданные строки в порядке.
(Остальная часть проекта сейчас представляет собой большой беспорядок, и ее очень сложно компилировать, поэтому она не является общедоступной, но в конечном итоге будет , должен ли я добиться успеха.)

Подробнее здесь: https://stackoverflow.com/questions/792 ... stom-net-h
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»