Visual Studio 2008では、Aが.NET 3.5をターゲットとしており、Bが.NET 2.0をターゲットにしていたときに、アセンブリA
からアセンブリB
を参照できました。
Visual Studio 2010では、これが許可されなくなりました。完全な問題は [〜#〜] msdn [〜#〜] で説明されています:
.NET Frameworkの異なるバージョンを対象とするプロジェクトまたはアセンブリを参照するアプリケーションを作成できます。たとえば、.NET Framework 4 Client Profileを対象とするアプリケーションを作成する場合、そのプロジェクトは.NET Frameworkバージョン2.0を対象とするアセンブリを参照できます。ただし、.NET Frameworkの以前のバージョンを対象とするプロジェクトを作成する場合、。NET Framework 4 Client Profileまたは.NET Framework 4。エラーを解消するには、アプリケーションが対象とするプロファイルが、アプリケーションが参照するプロジェクトまたはアセンブリが対象とするプロファイルと互換性があることを確認してください。
この点でVS2010をVS2008のように動作させる方法はありますか(つまり、より高いフレームワークバージョンを対象とするアセンブリへの参照を許可します)?
VS 2010の動作の背後にある理由と、知っておく必要のある展開の考慮事項を知っています。繰り返す必要はありません。
正確なエラーは次のとおりです。
警告MSB3268:プライマリ参照「xxx.dll」は、フレームワークアセンブリ「System.Core、Version = 3.5.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089」に間接的に依存しているため、解決できませんでした。現在ターゲットにされているフレームワーク。 「.NETFramework、Version = v2.0」。この問題を解決するには、参照「xxx.dll」を削除するか、「System.Core、Version = 3.5.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089」を含むフレームワークバージョンにアプリケーションを再ターゲットします。
ステップ1:.NET 2.0をターゲットとする参照プロジェクトをアンロードします
ステップ2:アンロードされたプロジェクトを右クリックし、コンテキストメニューから編集を選択します
ステップ3:<SpecificVersion>true</SpecificVersion>
を参照に追加します。以下は、私の再現ソリューションのサンプルです。
<ProjectReference Include="..\HighFX\HighFX.csproj">
<Project>{8DD71CAF-BEF7-40ED-9DD0-25033CD8009D}</Project>
<Name>HighFX</Name>
<SpecificVersion>true</SpecificVersion>
</ProjectReference>
ステップ4:プロジェクトをリロードします。
Visual Studio 2010内でビルドできるようになりましたが、以下のような警告が表示される場合がありますが、ビルドは成功する可能性があります。
ソース: http://social.msdn.Microsoft.com/Forums/en-US/msbuild/thread/dfadfb34-5328-4c53-8274-931c6ae00836
.NETフレームワークのバージョン番号は、2.0の後に混乱するようになりました。アセンブリは、not.NETフレームワークバージョンをターゲットにしますが、CLRバージョンをターゲットにします。また、フレームワークバージョン2.0、3.0、および3.5のCLRバージョンは同じ2.0.50727でした。
VS2008でバージョンを混在させることができるように見たのはそのためです。しかし、アセンブリの[AssemblyVersion]が表示されていましたが、これはCLRバージョンとは関係ありません。残念ながら、CLRバージョンは[プロパティ]ウィンドウに表示されません。メタデータで確認するには、Ildasm.exeを実行する必要があります。ただし、2.0.0.0と3.5.0.0の間のアセンブリバージョンはすべて、CLRバージョン2.0.50727を対象としていると安全に想定できます。
それは.NET 4.0で終わり、新しいCLRバージョン4.0.30319を取得しました。 MSDNの宣伝文句は、CLRバージョン2.0を対象とする場合、4.0を対象とするアセンブリを使用できないことを示しています。バージョン2.0 CLRは、.NET 4.0アセンブリのメタデータを読み取る方法を知らないため、形式が変更されました。唯一の回避策は、2.0.50727を要求している場合でも、force EXEがCLRの4.0バージョンをロードすることです。 app.exe.configファイルを使用してこれを行うと、次のようになります。
<configuration>
<startup>
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
また、Microsoftはv4.0を使用して正しく動作することを少しテストしましたが、v4.0を使用して、バグのある動作に依存する古いコードを壊すリスクを冒さずに簡単に修正できない2.0のいくつかの古いバグを修正しました。
Add <SpecificVersion>true</SpecificVersion> to the reference
多くのプロジェクトが相互に参照している大規模なソリューションでは、これはカスケード効果をもたらす可能性があり、これは手動で修正するのが面倒です。プロセスを自動化するために、以下にPowerShellスクリプトを作成しました。ソリューションの最上位で実行します-スクリプトは.csproj
ファイルを再帰的に検索し、部分GUIDに一致するProjectReference
要素を更新します。スクリプト)。
dir -recurse -filter *.csproj | foreach {
$xml = New-Object XML
$xml.Load($_.FullName)
# we want the ItemGroup that contains the references
$itemgroup = $xml.Project.ItemGroup | where { $_.ProjectReference }
# Project GUIDs to search for... (edit as needed for your projects)
$projrefs = $itemgroup.ProjectReference `
| where { !$_.SpecificVersion `
-and ( $_.Project -like "*CF2185B1*" `
-or $_.Project -like "*CF2185B2*" `
-or $_.Project -like "*CF2185B3*") `
}
if ($projrefs) {
Write-Host $_.FullName
foreach($ref in $projrefs) {
if($ref) {
# <specificversion>true</specificversion>
$el = $xml.CreateElement("SpecificVersion", $xml.Project.xmlns)
$el.InnerText = "true"
$ref.AppendChild($el) | out-null
Write-Host " updated: " $ref.Name
}
}
$xml.Save($_.FullName)
}
}
Write-Host "Press any key to continue ..."
$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Visual Studio 2015にアクセスしてください