Xamarin Forms UWP - Невозможно скомпилировать для цепочки инструментов.NET Native
У нас есть приложение, которое прекрасно компилируется без цепочки инструментов.NET Native, но когда мы нажимаем эту кнопку-флажок, мы получаем следующие ошибки компиляции (Debug или Release):
*Severity Code Description Project File Line Suppression State
Error at SerializationAssemblyGenerator.Program.GenerateDataContractSerializerHelper(IEnumerable`1 contracts, IEnumerable`1 jsonContracts, GeneratorSettings settings, String intermediateAssembly, IEnumerable`1 wcfSerializers) Adapt.Presentation.Helpdesk.UWP C:\Users\chris\.nuget\packages\microsoft.net.native.compiler\1.6.2\tools\Microsoft.NetNative.targets 691
Error at SerializationAssemblyGenerator.Program.Main(String[] args) Adapt.Presentation.Helpdesk.UWP C:\Users\chris\.nuget\packages\microsoft.net.native.compiler\1.6.2\tools\Microsoft.NetNative.targets 691
Error ILT0032: Failed to compile serialization code. See the build log for error details. Adapt.Presentation.Helpdesk.UWP C:\Users\chris\.nuget\packages\microsoft.net.native.compiler\1.6.2\tools\Microsoft.NetNative.targets 691
Error at SerializationAssemblyGenerator.Program.GenerateDataContractSerializerHelperCode(IEnumerable`1 contracts, IEnumerable`1 jsonContracts, IEnumerable`1 wcfSerializers) Adapt.Presentation.Helpdesk.UWP C:\Users\chris\.nuget\packages\microsoft.net.native.compiler\1.6.2\tools\Microsoft.NetNative.targets 691
Error at SerializationAssemblyGenerator.Program.AddKnownContractsLists(McgCodeTypeDeclaration container, ContractTables tables) Adapt.Presentation.Helpdesk.UWP C:\Users\chris\.nuget\packages\microsoft.net.native.compiler\1.6.2\tools\Microsoft.NetNative.targets 691
Error at System.Collections.Generic.Dictionary`2.get_Item(TKey key) Adapt.Presentation.Helpdesk.UWP C:\Users\chris\.nuget\packages\microsoft.net.native.compiler\1.6.2\tools\Microsoft.NetNative.targets 691
Error System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. Adapt.Presentation.Helpdesk.UWP C:\Users\chris\.nuget\packages\microsoft.net.native.compiler\1.6.2\tools\Microsoft.NetNative.targets 691*
В окне вывода много ошибок. Здесь слишком много постов, но вот несколько советов:
*1> C:\AdaptSource\Xivic\Adapt.Presentation.Helpdesk.UWP\obj\x86\Debug\ilc\in\System.Reflection.Extensions.dll
1> The assembly 'System.Reflection.Metadata.dll' is found in more than one folder.
1> file:///C:/AdaptSource/Xivic/Adapt.Presentation.Helpdesk.UWP/obj/x86/Debug/ilc/in/System.Reflection.Metadata.dll*
Я подумал, что, возможно, там были плавающие библиотеки DLL, и он не понимал, какой из них использовать, но это все же происходило даже после полной очистки Git.
Это Default.rd.xml
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
<Application>
<!--
An Assembly element with Name="*Application*" applies to all assemblies in
the application package. The asterisks are not wildcards.
-->
<Assembly Name="*Application*" Dynamic="Required All" />
<!-- Add your application specific runtime directives here. -->
</Application>
</Directives>
Из всего, что я понял, это должно включать все типы в нашем решении. Это предположение верно?
У меня есть ощущение, что это связано с указанием метаданных для типов, существующих в нашем проекте. Здесь есть статья, намекающая на это: https://docs.microsoft.com/en-us/dotnet/framework/net-native/getting-started-with-net-native. Но я не совсем понимаю, что он просит меня сделать, поэтому я застрял.
3 ответа
Вероятно, это было решено, но случайно ли ваше приложение выполняет сериализацию с использованием классов сериализации, таких как DataContractJsonSerializer или XmlSerializer?
У меня были похожие ошибки сборки, и я должен был добавить их в свой Dafault.rd.xml:
<Namespace Name="My.Namespace.Model" DataContractJsonSerializer="Required All" />
<Namespace Name="My.Namespace.Sql" XmlSerializer="Required All" />
Для специфического переопределения uwp в Forms.Init мне не нужно было включать какие-либо другие сборки, кроме сборок плагинов, как показано ниже (но это не вызывало никаких ошибок сборки / компиляции без него - только проблемы во время выполнения, такие как отсутствие значков шрифта):
List<Assembly> assembliesToInclude = new List<Assembly>();
assembliesToInclude.Add(typeof(FormsPlugin.Iconize.IconButton).GetTypeInfo().Assembly);
assembliesToInclude.Add(typeof(FormsPlugin.Iconize.UWP.IconControls).GetTypeInfo().Assembly);
Xamarin.Forms.Forms.Init(e, assembliesToInclude);
Я получил проблему с новым VS19(в VS17 работает нормально), когда я готовил свое приложение для публикации в Магазине Windows.
Выпуски сборки делаются успешно, но не для магазина Windows.
Помогает только git clean -xfd
Я полагаю, что в VS19 есть проблема с очисткой некоторых файлов при подготовке к сборке для Магазина Windows.
Если ваше приложение UWP ссылается на несколько сборок (например, сторонние управляющие библиотеки или само ваше приложение разделено на несколько PCL), Xamarin.Forms может быть не в состоянии загружать объекты из этих сборок (например, пользовательские средства визуализации).
Это может произойти при использовании цепочки инструментов Компилировать с собственным.NET, которая является опцией для приложений UWP в окне Свойства> Сборка> Общие для проекта.
Это можно исправить, используя UWP-специфическую перегрузку вызова Forms.Init в App.xaml.cs, как показано в приведенном ниже коде (вы должны заменить ClassInOtherAssembly реальным классом, на который ссылается код):
// you'll need to add `using System.Reflection;`
List<Assembly> assembliesToInclude = new List<Assembly>();
//Now, add in all the assemblies your app uses
assembliesToInclude.Add(typeof (ClassInOtherAssembly).GetTypeInfo().Assembly);
//Also do this for all your other 3rd party libraries
Xamarin.Forms.Forms.Init(e, assembliesToInclude);
// replaces Xamarin.Forms.Forms.Init(e);
Добавьте ссылку на каждую сборку, на которую ссылается приложение. Для получения дополнительной информации вы можете обратиться к исключению Target Invocation.
Это может произойти при использовании Compile with .NET Native tool chain
которая является опцией для приложений UWP в окне Свойства> Сборка> Общие для проекта.
Попробуйте снять этот флажок.
То, что говорит Nico Zhu - MSFT, должно работать в соответствии с этой статьей.