2017-06-20 6 views
3

Windows 10 UWP(15063)では、特定のカスタム属性で装飾された型を検出するためにアセンブリを呼び出す際に型を反復処理する必要があります。私は古いSystem.Reflection.Assembly.Current.GetCallingAssembly()メソッドを見つけることができませんでした。ここに私が思い付いた代替(未テストプロトタイプ)だ:これは、Windows 10 UWPでCalling Assemblyを取得する最善の方法ですか?

using System; 
using System.Diagnostics; 
using System.Reflection; 
using System.Linq; 

namespace UWPContainerUtility 
{ 

    public static class Helpers 
    { 
     public static Assembly GetCallingAssembly() 
     { 
      var thisAssembly = typeof(Helpers).GetTypeInfo().Assembly; 
      StackFrame[] frames = GetStackTraceFrames(); 
      var result = frames.Select(GetFrameAssembly) 
       .FirstOrDefault(NotCurrentAssembly); 
      return result; 

      StackFrame[] GetStackTraceFrames() 
      { 
       StackTrace trace = null; 
       try 
       { 
        throw new Exception(); 
       } 
       catch (Exception stacktraceHelper) 
       { 
        trace = new StackTrace(stacktraceHelper, true); 

       } 
       return trace.GetFrames(); 
      } 

      Assembly GetFrameAssembly(StackFrame f) 
      { 
       return f.GetMethod().DeclaringType.GetTypeInfo().Assembly; 
      } 

      bool NotCurrentAssembly(Assembly a) 
      { 
       return !ReferenceEquals(thisAssembly, a); 
      } 
     } 

    } 
} 

は、現在、実際に偽の例外を投げるよりも、この他を行うには、他の方法はありませんか?これを行う本当の方法は何ですか?

ありがとうございます!

*明瞭

+0

テストでは、これは失敗します。 StackTraceには1つのフレームしかありません。 –

+0

私は同意することができます。これは失敗します。受信アセンブリのコンテキストで例外をスローすると、受信アセンブリのみでスタックトレースが発生します。この作業を行うには、実際に呼び出しアセンブリに例外をスローする必要があります。しかし、それはばかげているでしょう。もちろん。 –

答えて

0

ために編集コード例私はこれが最善の方法だと思う:

IEnumerable<Assembly> GetCallingAssemblies() 
{ 
    var s = new StackTrace(); 
    return s.GetFrames() 
     .Select(x => x.GetMethod().DeclaringType.GetTypeInfo().Assembly) 
     .Where(x => !Equals(x, GetType().GetTypeInfo().Assembly)) 
     .Where(x => !x.FullName.StartsWith("Microsoft.")) 
     .Where(x => !x.FullName.StartsWith("System.")); 
} 

Assembly GetCallingAssembly() 
{ 
    return GetCallingAssemblies().First(); 
} 

注意してください、これはすべてのプロジェクトのためのドロップインソリューションではありません。 Microsoftのために、これをテストし調整する必要があります。システム。あなたのシナリオに合わないかもしれません。あなたのリストから除外するために、より多くの、またはより少ないアセンブリを持つかもしれません。現在のものをフィルタリングした後に最初のものを取り出すことは、呼び出しアセンブリを取得する最も明白な方法のようですが、スタックがどのように構築されているかに応じて、それも調整が必要な場合があります。

ポイントは、方法があります、これはあなたを開始されます。

幸運のベスト。

+0

これは.NET Core 2でのみ動作するため、Fall Creators Update –

関連する問題