5

私はAutofacプロジェクトに取り組んでおり、すべての共通ロジックをポータブルクラスライブラリに変換し、特定の機能のためにプラットフォーム固有のライブラリを追加しようとしています。

私の開発マシンはWindows8Enterprise(64ビット)であり、すべてのトリミングを備えたVS2012Ultimateがインストールされています。以前の.NETFrameworkのもの、追加のツール、または追加のPCL固有のツールはインストールされていません。これは、基本的なものだけを備えたクリーンで新しいVMです。この構成では、すべてのビルドとテストが正常に実行されます。

ポータブルクラスライブラリの1つに依存する.NET4.5(フルプロファイル)ライブラリでsecannotate.exeを実行しようとすると、 mscorlib2.0.5.0が必要であることを示すエラーが発生します

エラーの例を次に示します。PCLはAutofac.dllです。.NET4.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
  • Silverlight 5
  • .NETforWindowsストアアプリ

それらを対象とした新しい/空のPCLを作成してビルドすることで、問題を再現できます。mscorlib2.0.5.0を参照していることがわかります。

いくつかの検索により、これは古いSilverlightアセンブリバージョンへの参照であると私は信じていますが、PCLプロジェクトには特定のバージョン参照がないため、これがVS2012PCLツールによって導入されていることを想像できます。他の人は、VS2012より前にリリースされた.NETFrameworkアップデートをインストールすることで、同様の問題を修正したようです。実際には、マシンのどこにもmscorlib2.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

また、これは単なるPCLプロジェクトであり、直接何も参照していません。文字通り-.csprojファイルには単一の参照行はありません。

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

4

2 に答える 2

3

ポータブルライブラリ参照アセンブリを指す/dスイッチを渡す必要があります。次に例を示します。

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

デスクトップとCoreCLRmscorlibの混合に関する警告が表示されることに注意してください。これは、「ポータブル」はセカンノテートするCoreCLR(Silverlight)のように見えますが、.NETFrameworkのコンテキストで実行した場合はそうではないため無視できます。

于 2012-09-11T16:26:50.490 に答える
1

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

それに依存することになる方法が1つあります。Autofac-2.6.3.862-Portable.zipのダウンロードを開始した場合は、実際に2.0.5.0mscorlibに依存するバージョンのAutofac.dllを入手できます。マニフェストをダブルクリックして、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を参照するプロジェクトからビルドされました。その参照をプロジェクトから削除します。プロジェクト+参照の追加を使用し、代わりに[プロジェクト]タブを使用して、Autofacプロジェクトにチェックマークを付けます。

于 2012-09-11T01:48:49.113 に答える