Xamarin Forms UWP - невозможно скомпилировать для цепочки инструментов .NET Native

У нас есть приложение, которое отлично компилируется без цепочки инструментов .NET Native, но когда мы устанавливаем этот флажок, мы получаем следующие ошибки компиляции (отладка или выпуск):

*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. Но я действительно не понимаю, что он просит меня сделать, поэтому я застрял.


person Christian Findlay    schedule 06.09.2017    source источник


Ответы (4)


Вероятно, это было решено, но ваше приложение случайно выполняет сериализацию с использованием классов сериализации, таких как 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);
person dmc    schedule 02.03.2018

Если ваше приложение UWP ссылается на несколько сборок (например, сторонние библиотеки элементов управления или само приложение разделено на несколько PCL), Xamarin.Forms может быть не в состоянии загружать объекты из этих сборок (например, настраиваемые средства визуализации).

Это может произойти при использовании цепочки инструментов Compile with .NET Native, которая является опцией для приложений UWP в окне Properties ›Build› General для проекта.

Вы можете исправить это, используя специфичную для 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);

Добавьте ссылку на каждую сборку, на которую ссылается приложение. Для получения дополнительных сведений см. Исключение целевого вызова..

person Nico Zhu - MSFT    schedule 07.09.2017
comment
Просто читайте здесь между строк ... Есть ли какой-то пост-процесс в событии сборки, который загружает наш код и запускает метод Xamarin.Forms.Forms.Init? Если нет, то как вызов этого метода повлияет на компилятор? - person Christian Findlay; 08.09.2017
comment
Я пробовал передать каждую сборку, которую использует проект, и это не устранило ошибку. Я не понимаю, как это могло исправить ошибку времени компиляции. Это ошибочный ответ. - person The Pademelon; 08.09.2017
comment
Покажите, пожалуйста, более подробную информацию о Default.rd.xml в клиентском проекте uwp. - person Nico Zhu - MSFT; 08.09.2017
comment
Мы просто используем значения по умолчанию для Default.rd.xml. Мы пробовали поиграть с параметрами в этом файле, но, похоже, ничего не помогло. Что мы должны здесь поставить? Это влияет на компиляцию? - person Christian Findlay; 11.09.2017

У меня возникла проблема с новым VS19 (в VS17 работает нормально), когда я готовил свое приложение к публикации в Windows Store.

Релизные сборки делают успешно, но не для Windows Store.

Помогает только git clean -xfd

Я предполагаю, что в VS19 есть проблема с очисткой некоторых файлов в функции подготовки сборки для Магазина Windows.

person Pavlo Datsiuk    schedule 23.06.2019

Это может произойти при использовании Compile with .NET Native tool chain, который является параметром для приложений UWP в окне Свойства> Сборка> Общие для проекта.

Попробуйте снять этот флажок.

То, что говорит Нико, должно работать согласно в этой статье.

person Wilson Vargas    schedule 07.09.2017