UWP - Reflection_InsufficientMetadata_Edb Требуется в сборке выпуска

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

Reflection_InsufficientMetadata_EdbNeeded

Судя по моему поиску, похоже, что это связано с тем, что мое приложение использует отражение, а в режиме выпуска используется .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
    }
}

Настраиваемый атрибут и помощник перечисления:

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.


person jkh    schedule 08.02.2017    source источник


Ответы (1)


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

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

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

person jkh    schedule 08.02.2017