Skip to content

MS_MSBuildCS0012

nishi_74322014 edited this page Aug 21, 2026 · 1 revision

ビルド時に「error CS0012 The type 'xxxxx' is defined in an assembly that is not referenced.」が発生

概要

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 以降」**を
推奨しており、
net461net471 での組み合わせは
「動くこともある」程度と理解しておくのが安全である。

参考

Microsoft Learn


Tags: 移行, テスト, デバッグ, デプロイ, .NET開発

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally