Одна из вещей, которые мне нужно сделать, — это обеспечить совместимость синтаксического анализа 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)
Код: Выделить всё
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;
}
Будем благодарны за помощь?>
Подробнее здесь: https://stackoverflow.com/questions/798 ... -generator
Мобильная версия