UWP - Reflection_InsufficientMetadata_EdbNeeded 在发布版本中

UWP - Reflection_InsufficientMetadata_EdbNeeded in Release build

我有一个最基本的 UWP 解决方案,突出了我手头的问题。当我 运行 应用程序处于调试模式时,它 运行 没问题;在发布模式下,我收到以下错误:

根据我目前的搜索,这似乎是因为我的应用程序使用了反射,而发布模式使用了 .NET Native,它删除了编译器认为没有使用的文件。我一直无法找到合适的组合来添加到我的 Default.rd.xml 运行 时间指令文件中。

应用程序示例创建了一个应用于 MyNumberEnum 枚举值的自定义属性 (EnumStringValue),并具有一个 EnumHelper class 让用户检查给定字符串是否用作自定义属性值。

具有自定义属性的枚举:

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;
        }
    }
}

在同一库中的 UWPIssueDemo class 的构造函数中调用了 EnumHelper:

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

在调试模式下,运行没有问题。在 Release 模式下,上面截图中的异常(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

这不是正确的解决方案,但将 EnumStringValueAttribute class 和构造函数的可见性从内部更新为 public 允许应用程序 运行。

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

在 Default.rd.xml 文件中尝试不同的组合不成功。