2012-09-10 2 views
5

私はthe Autofac projectのすべての共通ロジックをPortable Class Librariesに変換し、特定の機能のためのプラットフォーム固有のライブラリを追加しようとしています。ポータブルクラスライブラリに依存するライブラリでsecannotate.exeを正常に実行するにはどうすればよいですか?

私の開発マシンはWindows 8 Enterprise(64-bit)で、VS 2012 Ultimateにはすべてのトリミングがインストールされています。以前の.NET Frameworkのインストール済みのもの、追加のツール、または追加のPCL固有のツールがありません。 基本的なものだけでクリーンで新しいVMです。すべてのビルドとテストはこの構成でうまく動作します。

私はポータブルクラスライブラリの一つに依存し、.NET 4.5(フルプロファイル)ライブラリ上secannotate.exeを実行しようと、私はエラーを取得する私は2.0.5.0をmscorlib必要示しています。

エラーの例を示します。 PCLはAutofac.dllです。 .NET 4.5のフルプロファイルライブラリはAutofac.Configuration.dllです。

Error running annotator: Could not find referenced assembly 'Assembly(Name=mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)'. Ensure that the reference paths and assemblies are setup correctly. 
Microsoft (R) .NET Framework Security Transparency Annotator 4.0.30319.17929 
Copyright (C) Microsoft Corporation. All rights reserved. 

Loaded assembly 'Autofac.Configuration' from 'C:\dev\opensource\autofac\trunk\build_output\bin\net40\Autofac.Configuration.dll'. 
Resolving assembly 'Assembly(Name=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)'. 
Loaded assembly 'mscorlib' from 'C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. 
Loaded referenced assembly from 'C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. 
Using core assembly: 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' from 'C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'. 
Assembly 'Autofac.Configuration' is using transparency model 'Level 2'. 
Assembly 'mscorlib' is using transparency model 'Level 2'. 
Loaded assembly 'Autofac' from 'C:\dev\opensource\autofac\trunk\build_output\bin\net40\Autofac.dll'. 
Resolving assembly 'Assembly(Name=mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)'. 
    at Microsoft.Security.Tools.CciHostEnvironment.ResolvingAssemblyReference(IUnit referringUnit, AssemblyIdentity referencedAssembly) 
    at Microsoft.Security.Tools.CciHostEnvironment.LoadCoreAssembly() 
    at Microsoft.Security.Tools.CciHostEnvironment..ctor(ISecAnnotateHost host, String rootAssemblyPath) 
    at Microsoft.Security.Tools.SecAnnotate.LoadInputAssemblies() 
    at Microsoft.Security.Tools.SecAnnotate.AnnotateAssemblies() 
    at Microsoft.Security.Tools.SecAnnotate.Main(String[] args) 

Autofacポータブルクラスライブラリターゲット:

  • は、.NET 4.0
  • シルバー5
  • Windowsストアのアプリ

用の.NETあなたは作成することによって、問題を再現することができますそれらのものをターゲットにして構築する新しい/空のPCLです。 mscorlib 2.0.5.0を参照しています。

これは古いSilverlightアセンブリバージョンへの参照であると私は信じていますが、PCLプロジェクトには特定のバージョン参照がないため、VS 2012 PCLツールで実装されることは想像できます。他の人は、VS 2012の前に出てきた.NETフレームワークアップデートをインストールすることで、同様の問題を修正したようです。私のマシン上のmscorlib 2.0.5.0は実際には見つかりません。私が構築Autofac.dllアセンブリでdotPeekでみる

は、私はそれが参照する参照:

  • mscorlib 2.0.5.0
  • システム2.0.5.0
  • System.ComponentModel.Composition 2.0.5.0
  • System.Core 2.0.5.0

そして、再び、それは直接anythを参照していない、ただPCLプロジェクトですing。文字通り - .csprojファイルにという単一の参照行ではなく、があります。

このsecannotateの問題を解決するにはどうすればよいですか?インストールする必要があるものはありますか? secannotateコマンドラインに追加する必要があるパラメータはありますか?

答えて

3

あなたは、たとえば、ポータブルライブラリリファレンスアセンブリを指して、/ dスイッチを渡す必要がありますので、無視することができますが、デスクトップとCoreCLRのmscorlibを混合周りの警告を取得します

secannotate /v "Autofac.Configuration.dll" /d:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0" 

を書き留め、 「ポータブル」はCoreCLR(Silverlight)のように見えますが、.NET Frameworkのコンテキストでは動作しません。

+0

please fast =)、私たちはプロジェクト内のPCLで生きていくことができません。生産的な環境では、この2.0.5.0フレームワークアセンブリを参照する方法はありません... – benwasd

+0

私は答えを更新しました。 –

+0

これは、開発マシンでの検証のみを修正します。いいえ?クライアントでのみ.NET 4.0がインストールされていました.NET 4.0のターゲットPCLアセンブリはまだロードできません。 – benwasd

1

Mscorlibバージョン2.0.5.0は、VS2012より前のPCLの初期バージョンで参照されていました。

あなたがそれに依存してしまう可能性がある明確な方法があります。あなたがAutofac-2.6.3.862-Portableで始まった場合。zipをダウンロードすると、Autofac.dllのバージョンが実際に2.0.5.0のmscorlibの依存関係になります。あなたがIldasm.exeをして見ることができる何か、をダブルクリックマニフェスト:

// Metadata version: v4.0.30319 
.assembly extern retargetable mscorlib 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       // |.....y. 
    .ver 2:0:5:0 
} 
.assembly extern retargetable System.Core 
{ 
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E)       // |.....y. 
    .ver 2:0:5:0 
} 
// etc.. 

ので、何とかは、あなたのAutofac.Configuration.dllをするのではなく、Autofac.dllのバージョンを参照するプロジェクトから構築されましたあなたが作成したもの。その参照をプロジェクトから削除します。 Project + Add Referenceを使用して、代わりにProjectタブを使用して、Autofacプロジェクトをチェックしてください。

+1

古いリファレンスもなければならないと思っていましたが、私はすでにチェックしました。 1つの大きなソリューション、すべてのプロジェクトの参考になります。トリプルチェック。それが私に困ってしまった理由です。 –

+0

私は質問にいくつかの情報を追加しました - 私が見ているアセンブリと参照のターゲットプラットフォームが表示されます。 –