UWP - Reflection_InsufficientMetadata_EdbNeeded в сборке выпуска
У меня есть решение UWP, которое подчеркивает мою проблему. Когда я запускаю приложение в режиме отладки, оно работает нормально; в режиме Release я получаю следующую ошибку:
Основываясь на моем поиске, кажется, что это происходит из-за того, что мое приложение использует рефлексию, а режим 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 не увенчалась успехом.