Режим отладки и выпуска приложений UWP

Я пытаюсь понять одну проблему, с которой я столкнулся, когда работал над приложениями UWP. Мне удалось исправить эту проблему, но я все еще не понимаю ее объяснение / доводы.

Я использую EventTriggerBehavior из XAMLBehaviours SDK в своей кодовой базе. Это событие должно было проверить «ClickedItem» в GridView.

Метод IAction.Execute из Microsoft.Xaml.Interactivity получает событие ClickedItem в качестве параметра.

Определение функции - объект IAction.Execute (отправитель объекта, параметр объекта)

Когда я запускал приложение в режиме отладки, оно работало нормально, и параметру присваивались правильные значения. Но когда я настроил Release, я понял, что мой Behaviors SDK работает некорректно.

Это был предыдущий фрагмент кода:

object IAction.Execute(object sender, object parameter)
    {

        object propertyValue = parameter;
        foreach (var propertyPathPart in propertyPathParts)
        {
            var propInfo = propertyValue.GetType().GetTypeInfo().GetDeclaredProperty(propertyPathPart);
            if (propInfo != null)
                propertyValue = propInfo.GetValue(propertyValue);
        }
    }

При дальнейшем исследовании я понял, что propertyValue не инициализируется с правильным значением. Следовательно, чтобы исправить это, я применил параметр Type Cast on.

object propertyValue = parameter as ItemClickEventArgs;

Теперь все стало нормально работать в Release Mode, в том числе и при включенной оптимизации кода.

Я бы сказал, что System.reflection не работает нормально в режиме Release, когда была включена цепочка инструментов Compile with .NET Native. Когда я сделал неявное приведение, это больше не было проблемой.

Согласно этому видео https://channel9.msdn.com/Shows/Going+Deep/Inside-NET-Native, Reflection все еще работает, но мне пришлось использовать кастом для Behaviors SDK. Я хотел бы узнать об этом более подробную информацию и правильно это понять.


person Aakansha    schedule 02.12.2015    source источник


Ответы (1)


В вашем проекте uwp вы можете найти файл с именем Default.rd.xml (внутри папки Properties). Это файл конфигурации, который указывает, доступны ли определенные программные элементы для отражения (или нет), когда включен .net native.

В вашей ситуации вы можете добавить следующее объявление, чтобы добавить тип ItemClickEventArgs. При необходимости есть возможность объявить пространство имен вместо типа.

<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. -->
    <Type Name="Windows.UI.Xaml.Controls.ItemClickEventArgs" Browse="Required Public"/>

  </Application>
</Directives>

Вы можете проверить эти ссылки для получения дополнительной информации:

Reflection и .NET Native

NET Native Deep Dive: Помогите! Я обнаружил исключение MissingMetadataException

person Jean-Sébastien Dupuy    schedule 02.12.2015