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