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 文件中尝试不同的组合不成功。
我有一个最基本的 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 文件中尝试不同的组合不成功。