- ОС: Ubuntu 24.04 Linux
- Рамка: .NET 8.0.10
- IDE: Rider (последняя версия)
Проблема в том, что я получаю логическое объяснение. противоречие при сравнении типов примерно в 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-код выглядит так, как и следовало ожидать.
- ОБНОВЛЕНИЕ: оно оказалось ложным: Ни одна сборка не загружается дважды.
Обновления:
- Я проверил расположение сборки на обоих типах объектов одинаковое.
- Это намек на то, что типы действительно различаются:
Код: Выделить всё
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
Код: Выделить всё
foreach (var assemblyLoadContext in AssemblyLoadContext.All)
{
Console.WriteLine($"AssemblyLoadContext: {assemblyLoadContext.Name}");
}
Console.WriteLine($"AssemblyLoadContext.Default: {AssemblyLoadContext.Default.Name}");
Код: Выделить всё
AssemblyLoadContext: Default
AssemblyLoadContext.Default: Default
Код: Выделить всё
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
Мобильная версия