UWP - Reflection_InsufficientMetadata_EdbNeeded в сборке выпуска

У меня есть решение UWP, которое подчеркивает мою проблему. Когда я запускаю приложение в режиме отладки, оно работает нормально; в режиме Release я получаю следующую ошибку:

Reflection_InsufficientMetadata_EdbNeeded

Основываясь на моем поиске, кажется, что это происходит из-за того, что мое приложение использует рефлексию, а режим Release использует.NET Native, который удаляет файлы, которые, по мнению компилятора, не используются. Мне не удалось найти правильную комбинацию для добавления в мой файл директив времени выполнения Default.rd.xml.

В примере приложения создается пользовательский атрибут (EnumStringValue), который применяется к значениям перечисления MyNumberEnum и имеет класс EnumHelper, который позволяет пользователю проверить, используется ли данная строка в качестве значения пользовательского атрибута.

Перечисление с пользовательскими атрибутами:

namespace MyLibrary.Core.Models
{
    public enum MyNumberEnum
    {
        Unknown = 0,
        [EnumStringValue("ONE1")]
        One = 1,
        [EnumStringValue("TWO2")]
        Two = 2,
        [EnumStringValue("THREE3")]
        Three = 3
    }
}

Пользовательский атрибут и помощник enum:

namespace MyLibrary.Core
{
    internal class EnumStringValueAttribute : Attribute
    {
        internal EnumStringValueAttribute(string rawValue)
        {
            this.RawValue = rawValue;
        }
        internal string RawValue { get; set; }
    }

    internal static class EnumHelper
    {
        internal static bool GetCustomAttribute<TEnum>(string value) where TEnum : struct
        {
            var fields = typeof(TEnum).GetRuntimeFields();
            foreach (var field in fields)
            {
                if (field.GetCustomAttributes(typeof(EnumStringValueAttribute), false).Any())
                {
                    string fieldRawValue = ((EnumStringValueAttribute)field.GetCustomAttributes(typeof(EnumStringValueAttribute), false).First()).RawValue;
                    if (fieldRawValue == value)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
    }
}

EnumHelper вызывается в конструкторе класса UWPIssueDemo в той же библиотеке:

namespace MyLibrary
{
    public class UWPIssueDemo
    {
        public UWPIssueDemo()
        {
            if (!EnumHelper.GetCustomAttribute<MyNumberEnum>("ONE1"))
            {
                throw new IOException("Couldn't find ONE1 (this is unexpected)");
            }
        }
    }
}

В режиме отладки он работает без проблем. В режиме выпуска исключение на снимке экрана выше (Reflection_InsufficientMetadata_EdbNeeded) происходит в следующей строке EnumHelper:

if (field.GetCustomAttributes(typeof(EnumStringValueAttribute), false).Any())

Я попытался добавить следующие строки в мой файл Default.rd.xml, но не видел никакого другого поведения:

<Assembly Name="MyLibrary" Dynamic="Required All"/>
<Type Name="MyLibrary.Core.EnumStringValueAttribute" Dynamic="All" Browse="All" Serialize="All"/>

Что мне нужно добавить в файл Default.rd.xml, чтобы запустить это приложение в режиме выпуска?

Я также загрузил сжатое решение этого примера на https://www.dropbox.com/s/dm3wi3oburvdn1o/UWPIssue.zip?dl=0.

1 ответ

Решение

Это не правильное решение, но обновление видимости класса и конструктора EnumStringValueAttribute с внутреннего на общедоступный позволило запустить приложение.

public class EnumStringValueAttribute : Attribute
{
    public EnumStringValueAttribute(string rawValue)
    {
        this.RawValue = rawValue;
    }
    internal string RawValue { get; set; }
}

Попытка различных комбинаций в файле Default.rd.xml не увенчалась успехом.

Другие вопросы по тегам