-
Notifications
You must be signed in to change notification settings - Fork 0
MS_MSBuildCS0012
- 戻る(MSBuild)
netstandardを参照する、net47 プロジェクトを
MSBuildでビルドしようとしたら error CS0012 が出た。
error CS0012: 型 'Object' は、参照されていないアセンブリに定義されています 。アセンブリ 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' に参照を追加する必要があります。
補足(なぜ
Objectが「参照されていない」のか): 一見すると
意味不明なメッセージだが、原因はnetstandard.dllという
型フォワーディング用のアセンブリにある。【netstandard2.0 ライブラリ側】 型 'Object' は netstandard.dll に定義されている(ことになっている) 【.NET Framework 側】 型 'Object' は mscorlib.dll に定義されている → netstandard.dll が「Object は mscorlib のものだ」と 型を転送(type forwarding)することで橋渡ししている → その netstandard.dll への参照が無い → コンパイラが型を辿れない → CS0012つまり、**「
Objectが無い」のではなく
「Objectへ辿り着くための中継アセンブリが無い」**という意味である。このため、.NET Standard 2.0 のライブラリを
.NET Framework から参照した時に限って発生する。
NuGet から、NETStandard.Library.NETFramework(preview)を追加すると解決する。
ただ、以降、実行時に以下の例外が発生するようになったので結局、revert した。
アセンブリ 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' から型 'System.Security.Cryptography.ECPoint' を読み込めませんでした。
Joperezr は、Microsoft は後でこれをツールに処理させることを計画していると述べている。
補足(現在は解消している/最新化): 原文が言及している
「Microsoft が後でツールに処理させる計画」は実現済みである。
現在、この問題は次の条件でほぼ発生しない。
条件 状況 .NET Framework 4.7.2 以降 標準で netstandard.dllを持つ。発生しない.NET Framework 4.6.1〜4.7.1 NuGet の NETStandard.Libraryが必要.NET Framework 4.6 以前 .NET Standard 2.0 はサポート外 SDK スタイル + VS 2017 15.7 以降 ツール側で自動的に解決される **第一の対処は「ターゲットを
net472以上に上げる」**である
(.NETバージョンアップ)。
4.7.2 以降はnetstandard.dllがフレームワークに同梱されるため、
追加の参照が一切要らない。<TargetFramework>net472</TargetFramework>
NETStandard.Library.NETFrameworkは preview のまま
正式版にならず、現在は使うべきではない。
原文が遭遇したECPointの実行時エラーは、
まさにこの preview パッケージが持つ
不完全な型フォワーディング表が原因である
(新しい API の一部が .NET Framework 側に存在しない)。
補足(4.7.2 に上げられない場合の対処): 事情があって
ターゲットを上げられない場合の選択肢を挙げておく。①
packages.config→ PackageReference に移行するPackageReference 方式では、
netstandard.dllへの参照が自動的に追加される。② 明示的に参照を追加する
<ItemGroup> <Reference Include="netstandard" /> </ItemGroup>③
NETStandard.Libraryを入れる(4.6.1〜4.7.1)Install-Package NETStandard.Libraryただし、この方式は
「which has a higher version」 や
MSB3247 といった
別の版衝突を誘発しやすい(System.*の分割パッケージが大量に入る)。結論:
net472以上に上げるのが最も確実で、
副作用も少ない。それが無理なら ① を検討する。
補足(
net47を選んだこと自体が地雷): 原文の状況は
net47という中途半端なバージョンであることが不運だった。net461 〜 net471 … .NET Standard 2.0 対応と称するが、 実際には NuGet パッケージによる補完が必要で不安定 net472 以降 … netstandard.dll を標準搭載。安定Microsoft 自身も **「.NET Standard 2.0 を使うなら 4.7.2 以降」**を
推奨しており、
net461〜net471での組み合わせは
「動くこともある」程度と理解しておくのが安全である。
- error CS0012: The type 'ValueType' is defined in an assembly that is not referenced. · Issue #1560 · xunit/xunit
https://github.com/xunit/xunit/issues/1560#issuecomment-463596994- You must add a reference to assembly netstandard errors · Issue #542 · dotnet/standard
https://github.com/dotnet/standard/issues/542 - c# - Type 'Object' is defined in an assembly that is not referenced (NET Standard 2.0/.NET Framework 4.6.1) - Stack Overflow
https://stackoverflow.com/questions/44652434/type-object-is-defined-in-an-assembly-that-is-not-referenced-net-standard-2-0
- You must add a reference to assembly netstandard errors · Issue #542 · dotnet/standard
- コンパイラ エラー CS0012
https://learn.microsoft.com/ja-jp/dotnet/csharp/misc/cs0012 - .NET Standard
https://learn.microsoft.com/ja-jp/dotnet/standard/net-standard - .NET Framework と .NET Standard の互換性
https://learn.microsoft.com/ja-jp/dotnet/standard/net-standard#net-framework-support
Tags: 移行, テスト, デバッグ, デプロイ, .NET開発
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。