15

VB、VS2012 で PCL をセットアップし、プロファイル 78 (WinRT、WinPhone8、.NET 4.5) 用に設定しました。GetExecutingAssemblyに空きがありませんAssemblythisによると、PCL で利用できるはずです。利用可能な唯一の方法はAssembly.Load().

私はこれで何をすべきですか?たとえば、これは本当ですか、私の環境はめちゃくちゃですか?GetExecutingAssembly以外にアクセスする別の方法はありImports System.Reflectionますか? 他のアイデアはありますか?

4

2 に答える 2

29

一般に、typeof(MyType).GetTypeInfo().Assembly代わりに のようなものを使用する必要がありAssembly.GetExecutingAssembly()ます。GetExecutingAssembly は基本的にコール スタックを調べて、それを呼び出しているメソッドを特定し、対応するアセンブリを検索する必要があります。メソッドがアセンブリの境界を越えてインライン展開されると、これが壊れる可能性があります。そのため、GetExecutingAssembly メソッドは、Profile 78 (および Windows ストア アプリ用の .NET) が使用する「新しい」反射面領域にありません。

于 2013-11-07T19:42:39.407 に答える
2

分離は、PCL 内で実際に深く、非常に細心の注意を払って実行されます。

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

バリアを突破する 1 つの方法を次に示します。

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 
}

このアプローチでは、サンドボックス化されたアセンブリ環境内でアクセス可能なアセンブリのみが生成されます。しかし、それはあなたが想定されていない「もの」にアクセスする方法の出発点を提供します.

于 2016-08-28T17:54:37.147 に答える