2013-10-31 15 views
15

VB、VS2012でPCLを設定し、プロファイル78(WinRT、WinPhone8、.NET 4.5)に設定しました。 AssemblyにはGetExecutingAssemblyがありません。 thisによれば、それはPCLsに利用可能でなければならない。利用できる唯一の方法はAssembly.Load()です。Assembly.GetExecutingAssemblyがPCLに存在しません

私はこれと何をすべきですか?例えば。これは本当ですか、私の環境が悪いですか?GetExecutingAssemblyImports System.Reflection以外にアクセスする別の方法はありますか?他のアイデア?

+0

たとえば、SilverlightとDesktopをターゲットとして使用できます。 WinRTまたはPhone、no。 –

+0

非同期/待機が必要なため、SLをターゲットできません。 SLは必要ありません。 –

+0

これは(http://stackoverflow.com/a/14754653/650012)SO答えはWindowsストアアプリケーションの 'GetExecutingAssembly()'にしか関係しませんが、役に立つかもしれません。 –

答えて

28

通常、Assembly.GetExecutingAssembly()の代わりにtypeof(MyType).GetTypeInfo().Assemblyのようなものを使用する必要があります。 GetExecutingAssemblyは、基本的に呼び出しスタックを調べて、どのメソッドが呼び出しているか把握し、対応するアセンブリをルックアップする必要があります。これは、GetExecutingAssemblyメソッドがProfile 78(Windowsストアアプリケーションの.NETと同様)が使用する「新しい」反射サーフェス領域にない理由で、アセンブリ境界を越えてメソッドがインライン化されると、破損する可能性があります。

+1

パーフェクト、ダニエルありがとう! –

1

分離は実際にはPLC内で深くてきめ細かく実行されます。

可搬性クラスライブラリ/ PLCがプラットフォームプロファイルとして存在しないことを理解することが重要です。実行中のアプリケーションでは、PLCプロジェクトのコンパイル時にコンパイラと同じ制限が発生することはありません。ここで

は障壁を打破する一つの方法です:

using System; 
... 
try { 
    var getExecutingAssembly = typeof(Assembly).GetRuntimeMethods() 
           .Where(m => m.Name.Equals("GetExecutingAssembly")) 
           .FirstOrDefault(); 
    var assemblies = getExecutingAssembly.Invoke(null, null); 
} catch(Exception exc){ 
    ... try something else 
} finally{ 
    ... time for some alternative 
} 

このアプローチだけで、あなたにサンドボックスアセンブリ環境内でアクセス可能アセンブリが得られます。しかし、それは、あなたが想定していない "もの"にアクセスする方法の出発点を与えます。

関連する問題