2012-07-10 1 views
12

リターゲッタブルアセンブリリファレンスは.NET Compact Framework用に導入され、現在はポータブルクラスライブラリをサポートするために使用されています。C#コンパイラはどのようにターゲット変更可能なアセンブリ参照を発行することにしますか?

基本的に、コンパイラは以下のMSILを発する:

.assembly extern retargetable mscorlib 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       
    .ver 2:0:5:0 
} 

は、どのようにC#コンパイラは、それがリターゲッタブルの参照を放出しなければ理解して、どのようにしても、ポータブルの外にそのような参照を放出するためにC#コンパイラを強制的にクラスライブラリ?

+0

MSBuildターゲットファイルのヒントはありませんか?私はあなたがコマンドラインからコンパイラに渡す必要があるのだろうか。 – leppie

答えて

2

アセンブリ自体については、アセンブリフラグ、つまり[assembly:AssemblyFlags(AssemblyNameFlags.Retargetable)]です。

このフラグは、プラットフォームアセンブリの外側では意味がないことに注意してください。カスタムアセンブリは再ターゲット可能ではありません。

参照のため、参照されているアセンブリから名前の一部としてコピーされます。

+0

ありがとう。これは私が探していたものです。私はメッセージ「ファイルやアセンブリを読み込めませんでした」PostSharp、Version = 3.0.0.0、Culture =ニュートラル、PublicKeyToken = 53d2effcf2ee70dc、Retargetable = Yesまたはその依存関係の1つを取り除くことを望んでいました。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(HRESULTからの例外:0x80131040) '(IHostAssemblyStoreを介して)CLRが要求したものよりも別のアセンブリを提供しても、ターゲット変更可能な参照でもエラーが発生します。この問題を回避する方法はありますか? –

+0

Retargableは、あなたが試みていると仮定しているように、ユーザーアセンブリをキージャンプさせることはできません。これは、CLRの内部目的のためだけです。私はホスティングAPIの専門家ではありませんが、私はLoadFileがそれを可能にするかもしれないと思います。 –

+0

ありがとうございます。私は別の解決策を試みます:同じ短い名前、同じ強い名前のキー、しかし異なるバージョン番号。通常のバインディングポリシーでは、このトリックを行う必要があります。 –

2

これが役立つかどうかはわかりませんが、次のファイルが自動生成され、ビルドに含まれています。

using System; 
using System.Reflection; 
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(
    ".NETPortable,Version=v4.0,Profile=Profile4", 
    FrameworkDisplayName = ".NET Portable Subset")] 

これは、コンパイラがいくつかの魔法を行うことを示唆しているかもしれません。

編集:

私は上記のライブラリをポータブルにすると思います。コマンドラインから/nostdlib+が使用され、ポータブルmscorlib.dllが参照されていることがわかります(これは前述の属性と同じです)。 "Profile4の\のMscorlib.dll \ ... \プログラムファイル\リファレンスアセンブリ\マイクロソフト\ Framework.NETPortable \ V4.0の\プロファイル"

+1

'TargetFrameworkAttribute'は、ClientおよびFull Frameworkのv4用ビルドにも存在しますが、v3.5用ではありません。これにより、属性が追加された可能性があります。 v4では、アセンブリが完全なフレームワークまたはクライアントプロファイル用に構築されたかどうかを判断する非常に簡単な方法も提供されます。 –

+0

@AdamHouldsworth:ありがとう、私はクライアントのプロファイルが4.5になったので、今は廃止されていると思いますか? ; p – leppie

+0

.NET 4でも、クライアントプロファイルとフルダウンロードの違いは、それほど価値がないMB LOLの2倍でした。なぜなら、おそらく彼らがPCLを好んで缶詰めした理由です。 –

0

私はC#コンパイラを作るだろうと実験で気づきました(MSILの.assemblyセクションの修飾子)としてマークされている場合、参照可能なコンパイラはリターゲット可能です。私はコンパイラがどのようにしてアセンブリを再ターゲット可能にすることを決定したのか分かりませんでした。

関連する問題