Приложение uwp имеет динамические переменные, что приводит к сбою приложения в режиме выпуска.

в моем приложении uwp я использую динамические переменные во многих местах, потому что данные поступают из серверного API-интерфейса, поэтому мы хотим, чтобы они были динамическими. он отлично работает в режиме Debug, но я хотел загрузить его в магазин, поэтому я попробовал его в режиме Release, и он не работает со следующим исключением

system.reflection.missingmetadataexception

очевидно, это исключение возникает на одной из моих страниц с именем LoginPage.xaml.cs в первой строке, где я пытаюсь использовать динамические данные. Ниже приведена строка, которая вызывает исключение.

ViewModel.backgroundURL = AppConfig.Login.background;

AppConfig здесь — статический объект в классе констант. и его тип динамический, я успешно получаю его из серверного API, но исключение возникает только тогда, когда я пытаюсь использовать его в своем приложении, как вы можете видеть в строке кода выше.

после некоторых исследований я обнаружил, что использование следующей строки в Default.rd.xml может решить эту ошибку. Я поместил туда следующую строку.

<Namespace Name="bluebook.ViewModels" Seralize="All" />

как вы можете видеть, я помещаю эту строку в свой тег директив, как показано ниже.

<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. -->
        <Namespace Name="bluebook.ViewModels" Serialize="All" />

    </Application>
</Directives>

Я пытаюсь выполнить директивы для ViewModels, потому что поля, которым я назначаю, находятся в классе ViewModel. Я также пытался сделать это в пространстве имен Views, в котором есть все классы представлений, такие как LoginPage и другие, но в обоих случаях исключение все еще происходит, точно в той же строке. .

Обновление 1

Сведения об исключении

System.Reflection.MissingMetadataException: 'Reflection_InsufficientMetadata_NoHelpAvailable: EETypeRva:0x000a8990.

StackTrace: ноль

Источник: ноль


person Muhammad Touseef    schedule 06.03.2018    source источник


Ответы (2)


В вашем файле директив написано «Сериализация» с ошибкой?

person Michael S. Scherotter    schedule 06.03.2018
comment
Нет, на самом деле я написал свойство Serialize, я изменил написание. строка, которую я вставил сюда, была фактически скопирована из закомментированного кода, который уже присутствует в файле по умолчанию. и у него неправильное написание, но я исправил его перед запуском. - person Muhammad Touseef; 06.03.2018
comment
Я отредактировал вопрос с правильным написанием, так что теперь нет путаницы по этому поводу :) - person Muhammad Touseef; 06.03.2018
comment
Можете ли вы показать, как вы десериализуете типы? Если вы используете DataContractSerializer неявно или XmlSerializer, вам необходимо добавить эти атрибуты в директиву RD. - person Michael S. Scherotter; 06.03.2018
comment
Для этой цели я использую библиотеку NewsoftJson, поэтому использую метод Json.Deserialize(), а затем получаю возвращаемый объект динамического типа, и когда я пытаюсь использовать значения в этом динамическом объекте, я получаю исключение. - person Muhammad Touseef; 06.03.2018
comment
Есть ряд других атрибутов сериализации, которые можно попробовать — intellisense в rd.xml покажет вам. Также создайте отладочную версию с установленным .Net native и Enable static analysis for .NET Native. Это покажет вам предупреждения в сборке типов, для которых вам нужны директивы RD.xml. - person Michael S. Scherotter; 07.03.2018
comment
да, я пробовал это, но я не получаю предупреждений о директивах. кажется странным - person Muhammad Touseef; 07.03.2018

Попробуйте добавить <Type Name="Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder" Dynamic="Required All"/> в свой Default.rd.xml.

(Этот ответ может иметь отношение к вам - ответил кто-то, кто работает с .Net Native - Сборка с помощью цепочки инструментов .NET Native вызывает ошибку с отсутствующим свойством в динамическом объекте )

person Johnny Westlake    schedule 07.03.2018
comment
Нет, я пробовал это, но та же ошибка все еще возникает в том же месте - person Muhammad Touseef; 07.03.2018
comment
Вы посмотрите на исключение, там будут более конкретные детали, чем system.reflection.missingmetadataexception, вы можете вставить их сюда? Он будет ссылаться на более конкретный тип. - person Johnny Westlake; 07.03.2018
comment
да, я изучил детали и разместил подробности в разделе обновления моего вопроса. - person Muhammad Touseef; 07.03.2018
comment
В этом случае я думаю, что включение компиляции с помощью цепочки инструментов .NET Native в режиме DEBUG должно дать вам более информативную ошибку о том, какая фактическая информация о типе отсутствует. (Если только эта информация об ошибке не появилась при запуске в Debug, в этом случае... все сложно = P) - person Johnny Westlake; 07.03.2018
comment
да, к сожалению, до сих пор не получена трассировка стека даже после включения компиляции собственной цепочки инструментов .net в режиме отладки. - person Muhammad Touseef; 07.03.2018