2017-02-08 9 views
1

私は手元にある問題を強調するベアボーンUWPソリューションを持っています。デバッグモードでアプリケーションを実行すると、正常に動作します。リリースモードでは、私は次のエラーが表示されます。私の検索に基づいてリリースビルドでUWP - Reflection_InsufficientMetadata_EdbNeededが必要です

Reflection_InsufficientMetadata_EdbNeeded

はこれまでのところ、それは私のアプリは、リフレクションを使用することに起因しているように思える、とモードは、.NETネイティブたストリップを使用してリリースコンパイラが考えていないファイルを使用しています。 Default.rd.xmlランタイム・ディレクティブ・ファイルに追加する正しい組み合わせを見つけることができませんでした。

appサンプルでは、​​MyNumberEnumの列挙値に適用されるカスタム属性(EnumStringValue)が作成され、ユーザーが指定された文字列がカスタム属性値として使用されているかどうかを確認できる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にアップロードしました。

答えて

0

これは適切な解決策ではありませんが、EnumStringValueAttributeクラスとコンストラクターの可視性を内部からパブリックに更新すると、アプリケーションが実行できるようになりました。

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

Default.rd.xmlファイルでさまざまな組み合わせを試しても失敗しました。

関連する問題