Статически сгенерированный код синтаксического анализа 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.
  • При компиляции я вижу, что создается код. Утилита создания сериализации .NET Xml, версия 10.0.1] Импорт mediainfoType (2/6).
  • В моем коде все еще возникают ошибки формата dotnet об AOT, IL2026 и IL3050.
  • Если я поставлю точку останова на сгенерированный фабричный код, он никогда не будет достигнут:

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

     public override System.Xml.Serialization.XmlSerializer GetSerializer(System.Type type)
    
Создание кода C# из XSD и создание XML-файла для десериализации:

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

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

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




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#»