Статически сгенерированный код синтаксического анализа XML с использованием Microsoft.XmlSerializer.Generator и sgen не C#

Место общения программистов C#
Ответить
Anonymous
 Статически сгенерированный код синтаксического анализа XML с использованием Microsoft.XmlSerializer.Generator и sgen не

Сообщение Anonymous »

Я конвертирую проект .NET 9 в .NET 10 и делаю его совместимым с AOT.

Одна из вещей, которые мне нужно сделать, — это обеспечить совместимость синтаксического анализа XML с AOT, и я использую Microsoft.XmlSerializer.Generator для создания собственного кода синтаксического анализа XML.
Я получаю работу части проекта и вижу сгенерированный код сериализации, но когда я запускаю свой код, предварительно сгенерированный код сериализации не используется, и я по-прежнему получаю предупреждения компилятора о том, что мой код несовместим с AOT.
Насколько я исследовал, фабрика XML должна автоматически подхватывать сгенерированный код и использовать его, но установка точек останова в этом коде не выполняется.
Пример:
  • Я создаю код C# из XSD, используя xsd D:\mediainfo_2_0.xsd /classes /namespace:Sandbox с mediainfo_2_0.xsd.
  • Мне не нужен sgen для всех классов, и я добавляю Sandbox.TestXml;Sandbox.mediainfoType;Sandbox.creationType;Sandbox.extraType;Sandbox.trackType;Sandbox.mediaType в CSPROJ file.
  • При компиляции я вижу, что создается код. Утилита создания сериализации .NET Xml, версия 10.0.1] Импорт медиаинформационного типа (2/6).
  • В моем коде я все еще получаю ошибки формата dotnet об AOT, IL2026 и IL3050.
  • Если я поставлю точку останова на сгенерированную фабрику код, он никогда не попадает в цель. общедоступное переопределение System.Xml.Serialization.XmlSerializer GetSerializer(тип System.Type)
Создание кода C# из XSD и создание XML-файла для десериализации:

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

xsd D:\mediainfo_2_0.xsd /classes /namespace:Sandbox
mediainfo 'D:\test\foo.mkv' --Output=XML > D:\MediaInfo.xml
Файл CSPROJ:

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

  



true
Sandbox.TestXml;Sandbox.mediainfoType;Sandbox.creationType;Sandbox.extraType;Sandbox.trackType;Sandbox.mediaType

Пример кода:

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

XmlSerializer serializer = new XmlSerializer(typeof(mediainfoType));

using FileStream fsXml = new(@"D:\MediaInfo.xml", FileMode.Open);
using XmlReader reader = XmlReader.Create(
fsXml,
new XmlReaderSettings { DtdProcessing = DtdProcessing.Prohibit, XmlResolver = null }
);
mediainfoType mediaInfo = (mediainfoType)serializer.Deserialize(reader);

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

dotnet format
ошибки:

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

C:\Users\piete\Source\Repos\ptr727\PlexCleaner\Sandbox\TestSomething.cs(14,36): info IL2026: Using member 'System.Xml.Serialization.XmlSerializer.XmlSerializer(Type)' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. Members from serialized types may be trimmed if not referenced directly. [C:\Users\piete\Source\Repos\ptr727\PlexCleaner\Sandbox\Sandbox.csproj]
C:\Users\piete\Source\Repos\ptr727\PlexCleaner\Sandbox\TestSomething.cs(14,36): info IL3050: Using member 'System.Xml.Serialization.XmlSerializer.XmlSerializer(Type)' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. XML serializer relies on dynamic code generation which is not available with Ahead of Time compilation. [C:\Users\piete\Source\Repos\ptr727\PlexCleaner\Sandbox\Sandbox.csproj]
C:\Users\piete\Source\Repos\ptr727\PlexCleaner\Sandbox\TestSomething.cs(17,50): info IL2026: Using member 'System.Xml.Serialization.XmlSerializer.Deserialize(Stream)' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application code. Members from deserialized types may be trimmed if not referenced directly. [C:\Users\piete\Source\Repos\ptr727\PlexCleaner\Sandbox\Sandbox.csproj]
C:\Users\piete\Source\Repos\ptr727\PlexCleaner\Sandbox\TestSomething.cs(17,50): info IL3050: Using member 'System.Xml.Serialization.XmlSerializer.Deserialize(Stream)' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. XML serializer relies on dynamic code generation which is not available with Ahead of Time compilation.  [C:\Users\piete\Source\Repos\ptr727\PlexCleaner\Sandbox\Sandbox.csproj]
Сгенерированный код:

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

        public override System.Xml.Serialization.XmlSerializer GetSerializer(System.Type type) {
if (type == typeof(global::Sandbox.TestXml)) return new TestXmlSerializer();
if (type == typeof(global::Sandbox.mediainfoType)) return new mediainfoTypeSerializer();
if (type == typeof(global::Sandbox.creationType)) return new creationTypeSerializer();
if (type == typeof(global::Sandbox.extraType)) return new extraTypeSerializer();
if (type == typeof(global::Sandbox.trackType)) return new trackTypeSerializer();
if (type == typeof(global::Sandbox.mediaType)) return new mediaTypeSerializer();
return null;
}
Я успешно преобразовал свой синтаксический анализ JSON для использования JsonSerializerContext, который отлично работает, но я не могу добиться совместимости моего синтаксического анализа XML с AOT.
Будем благодарны за помощь?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... -generator
Ответить

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

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

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

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

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