Одна из вещей, которые мне нужно сделать, — это обеспечить совместимость синтаксического анализа XML с AOT, и я использую Microsoft.XmlSerializer.Generator для создания собственного кода синтаксического анализа XML.
Я получаю часть проекта работающей и вижу сгенерированный код сериализации, но когда я запускаю свой код, предварительно сгенерированный код сериализации не используется, и я по-прежнему получаю предупреждения компилятора о том, что мой код несовместим с AOT.
Насколько я исследовал, фабрика XML должна автоматически подхватывать сгенерированный код и использовать его, но установка точек останова в этом коде не происходит.
В качестве примера:
- Я создаю код C# из XSD, используя xsd D:\mediainfo_2_0.xsd /classes /namespace:Sandbox с mediainfo_2_0.xsd.
- Мне не нужен sgen для всех классов, и я добавляю
в файл .csproj.
Код: Выделить всё
Sandbox.TestXml;Sandbox.mediainfoType;Sandbox.creationType;Sandbox.extraType;Sandbox.trackType;Sandbox.mediaType - При компиляции я вижу, что создается код. Утилита создания сериализации .NET Xml, версия 10.0.1] Импорт mediainfoType (2/6).
- В моем коде все еще возникают ошибки формата dotnet об AOT, IL2026 и IL3050.
- Если я поставлю точку останова на сгенерированный фабричный код, он никогда не будет достигнут:
Код: Выделить всё
public override System.Xml.Serialization.XmlSerializer GetSerializer(System.Type type)
Код: Выделить всё
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;
}
Любая помощь приветствуется
Подробнее здесь: https://stackoverflow.com/questions/798 ... -generator
Мобильная версия