アセンブリ 'mscorlibからタイプ' System.Runtime.CompilerServices.ExtensionAttribute 'を読み込めませんでした


145

Webサイトを初めて起動したときに、このエラーが発生します

Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

何が悪いのですか?

.NET 4を使用しており、Visual Studioからサイトを起動しています。

最近変更したのは、プロジェクトにSimple Injector(Nugetを使用)を追加することだけです。

これがスタックトレースです

[TypeLoadException: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.]
   System.ModuleHandle.ResolveType(RuntimeModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type) +0
   System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext) +180
   System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) +192
   System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport scope, Assembly& lastAptcaOkAssembly, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList derivedAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctor, Boolean& ctorHasParameters, Boolean& isVarArg) +115
   System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent) +426
   System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeAssembly assembly, RuntimeType caType) +103
   System.Reflection.RuntimeAssembly.GetCustomAttributes(Type attributeType, Boolean inherit) +64
   WebActivator.AssemblyExtensions.GetActivationAttributes(Assembly assembly) +132
   WebActivator.ActivationManager.RunActivationMethods() +216
   WebActivator.ActivationManager.RunPreStartMethods() +43
   WebActivator.ActivationManager.Run() +69

[InvalidOperationException: The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'..]
   System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +423
   System.Web.Compilation.BuildManager.CallPreStartInitMethods() +306
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +677

[HttpException (0x80004005): The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'..]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9090876
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
   System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +258

すべてのビューの最初の行が強調表示され、それらにカーソルを合わせると、このエラーが発生します

The pre-application start initialisation method Run on type WebActivator.ActivationManager threw an exception with the following error message Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

1
あなたがあなたのウェブサイトをどこから始めているのか、そしてその方法についてもっと多くの文脈が必要です。間違いなく.NET 4 / 4.5を使用していますか?
— Jon Skeet

1
注意:ビルドサーバーからの出力に同じ症状がある場合は、.net 4.0参照アセンブリがあることを確認してください。.net4.5をインストールした後、それらを開発ボックスからコピーする必要があります。C:これらは、どこかのような典型的\プログラムファイル(x86の)\詳細についてはリファレンスアセンブリ\マイクロソフト\ Frameworkの\ .NETFramework \ V4.0が見marcgravell.blogspot.co.nz/2012/09/...
— ミステリーオブ

1
.NET 4.0のみがインストールされているマシンでMicrosoft Dynamics CRM 2011のプラグインとして.NET 4.5 DLLが使用されている場合にも、同様の問題が発生しました。完全に拒否するのではなく、登録してワークフローのカスタマイズを完全に解除しました(プラグインにはカスタムワークフローアクティビティが含まれていました)。Traceは、mscorlibでExtensionAttributeが見つからないことを示したので、ここに誘導し、.NET 4.0用に再構築して問題を解決しました!それは将来のGoogle-fuで言及されるべきだと思いました。
— マシューウォルトン2014年

回答:


262

型mscorlibから型 'System.Runtime.CompilerServices.ExtensionAttribute'を読み込めませんでした

はい、.NET 4.5ではなく.NET 4.0でコードを実行すると、技術的に問題が発生する可能性があります。属性は、.NET 4.5でSystem.Core.dllからmscorlib.dllに移動されました。それは100%互換性があるはずのフレームワークバージョンではかなり厄介な重大な変更のように聞こえますが、[TypeForwardedTo]属性はこの違いを観察不可能にすることになっています。

マーフィーがそうであるように、このような適切に意図されたすべての変更には、誰も考えなかった少なくとも1つの障害モードがあります。ILMergeを使用して複数のアセンブリを1つにマージし、そのツールを誤って使用した場合、これはうまくいかないようです。この破損を説明する適切なフィードバック記事がここにあります。間違いを説明するブログ投稿にリンクしています。かなり長い記事ですが、正しく解釈すると、間違ったILMergeコマンドラインオプションがこの問題の原因になります。

  /targetplatform:"v4,c:\windows\Microsoft.NET\Framework\v4.0.30319"

不正解です。プログラムをビルドするマシンに4.5をインストールすると、そのディレクトリ内のアセンブリは4.0から4.5に更新され、4.0をターゲットにするのに適さなくなります。これらのアセンブリは実際には存在しないはずですが、互換性の理由で保持されていました。適切な参照アセンブリは4.0参照アセンブリであり、別の場所に格納されています。

  /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"

したがって、可能な回避策は、ビルドマシンで4.0にフォールバックし、ターゲットマシンに.NET 4.5をインストールして実際の修正を行い、提供されたソースコードからプロジェクトを再ビルドして、ILMergeコマンドを修正することです。


この障害モードはILMergeに限定されているわけではなく、ごく一般的なケースです。これらの4.5アセンブリが4.0を対象とするプロジェクトで参照アセンブリとして使用されている他のシナリオは、同じように失敗する可能性があります。他の質問から判断すると、別の一般的な障害モードは、有効なVSライセンスを使用せずにセットアップされたビルドサーバーです。また、マルチターゲティングパックは無料でダウンロードできることも見逃せません。

c:\ program files(x86)サブディレクトリの参照アセンブリを使用することは、難しい要件です。.NET 4.0以降、4.01、4.02、および4.03リリースで追加されたクラスまたはメソッドへの依存関係を誤って回避することを回避するためにすでに重要です。しかし、4.5がリリースされた今、絶対に不可欠です。


31
なんて素晴らしい答えでしょう。
— Sachin Kainth

6
すべて同じ症状が出ますが、ILMergeを使用していません。ここでstacktraceはissues.umbraco.org/issue/U4-1708であり、サードパーティまたはフォースパーティのDLLである可能性がありますが、どのようにして見つけることができますか?
— ミスター2013

3
注:64ビットのWindowsバージョンの場合、「C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0」フォルダがない可能性があります。その場合、「C:\ Programファイル(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 "フォルダー。
— Maarten Docter 2013年

3
ILMergeをインストールしていませんが、この問題があります。どうすれば修正できますか?ターゲットサーバーに.net 4.5をインストールする必要がありますか?
— TamarG 2013

4
これがMSが解決すべき問題であると誰もが主張し続けるのは、私にとって戸惑っています。彼らはしません、彼らはあなたの壊れたプロジェクトを修正したり、サーバーを構築したりできません。正しい参照アセンブリを使用して、問題を解決してください。
— ハンスパッサント2014

9

ロードできなかったタイプがSystem.Reflection.AssemblyMetadataAttributeであったことを除いて、私はこの問題を抱えていました。Webアプリケーションは、.NET 4.5がインストールされたマシンでビルドされ(そこで正常に実行)、4.0をターゲットフレームワークとして使用しましたが、4.0のみがインストールされたWebサーバーで実行すると、エラーが表示されました。次に、4.5がインストールされているWebサーバーで試したところ、エラーは発生しませんでした。したがって、他の人が言ったように、これはすべて、Microsoftが4.5をリリースするという厄介な方法によるものです。これは、基本的にバージョン4.0へのアップグレード(および上書き)です。System.Reflectionアセンブリは4.0(AssemblyMetadataAttribute)に存在しない型を参照するため、新しいSystem.Reflection.dllがないと失敗します。

ターゲットWebサーバーに.NET 4.5をインストールするか、4.5がインストールされていないマシンでアプリケーションをビルドできます。理想的な解像度とはかけ離れています。


8

サイト(Kentico CMS)でこれとまったく同じ問題が発生しました。4.5で開発を開始し、運用サーバーが4.0しかサポートしていないことを知り、4.0のターゲットフレームワークに戻ってみました。このスレッドの他の投稿をコンパイルします(ターゲットフレームワークを.Net 4と.Net 4.5に変更します)。私のソリューションを検索したところ、少数のNuGetパッケージがまだtargetFramework = "net45"のライブラリを使用していることがわかりました。

packages.config (before):
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AutoMapper" version="3.1.0" targetFramework="net45" />
  <package id="EntityFramework" version="5.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.0.0" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" />
</packages>

プロジェクトのターゲットフレームワークを4.5に戻し、すべてのNuGetライブラリを削除し、4.0に戻し、ライブラリを再度追加しました(4.5に依存しない以前のバージョンを使用する必要がありました)。

packages.config (after):
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AutoMapper" version="3.1.1" targetFramework="net40" />
  <package id="EntityFramework" version="6.0.2" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebApi.Client" version="4.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net40" />
  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
</packages>

5

今日私はこの厄介な問題に出くわしました。SmartAssemblyを使用して.NETアセンブリをパック/難読化しましたが、突然、最終製品がテストシステムで機能しなくなりました。.NET 4.5がインストールされているとは思わなかったが、約1か月前に何かがインストールされたようだ。

4.5をアンインストールして4.0を再インストールしたところ、すべてが再び機能するようになりました。これについて午後を吹き飛ばしたことにあまり感銘を受けていません。


事前に警告します。それ以外の方法で問題を解決した場合でも、難読化されたバージョンは再び壊れるので、問題を解決したことは決してわかりません。つまり、4.5でビルドして、4.0のみのマシンに問題なくデプロイできます。私に必要なのは、Hans Passantが言及したマルチターゲティングパッチだけでした。ILDASMのマニフェストを見ると、mscorlibではなくSystem.Coreを正しくターゲットにしていることがわかりました。ただし、SmartAssembly(v5.5)で実行されたバージョンではサポートされません。
— Josh

4

Firebirdデータベースからデータを読み取ろうとしたときに、同じ問題が発生しました。何時間も検索した結果、問題の原因はクエリでのエラーが原因であることがわかりました。修正すると、完全に機能します。フレームワークのバージョンとは何の関係もありませんでした


男、ありがとう、私は同じ問題に遭遇しました、どうやってそれを修正しましたか?
— Benny

3

この問題に遭遇し、Googleマップビューの支援に使用していたGeocoding.net NuGetパッケージまで追跡しました(Geocoding.netバージョン3.1.0は2014年2月4日公開)。

パッケージファイルを調べたり、Jet BrainsのDot Peekアプリケーションを使用して表示したりすると、ジオコーディングdllは.Net 4.0のように見えます。ただし、私の同僚は、これはilmergeを使用してコンパイルされたため、上記のilmergeの問題に関連している可能性が高いと述べています。

それを追跡するのは長いプロセスでした。前述のNuGetパッケージを追加したチェンジセットに絞り込むまで、TFSからさまざまなチェンジセットをフェッチしました。それを削除した後、.NET 4サーバーにデプロイすることができました。


私たちの場合、問題はQuartz.NET v2.3が原因です。バージョン2.3.2にアップグレードすると、問題が修正されました。
— Vertigo

2

私の場合、.NET 4.5から.NET 4.0にダウングレードした後、プロジェクトはローカルマシンでは正常に機能していましたが、公開後にサーバーで失敗しました。

宛先にはいくつかの古いアセンブリがあり、それでも.NET 4.5を参照していることがわかりました。

公開オプション「公開する前に既存のファイルをすべて削除する」を有効にすることで修正しました


1

私の場合、それはTeamCityマシンで見逃されたBlend SDKでした。これにより、アセンブリの不適切な解決方法が原因でエラーが発生しました。


1

ここにたどり着くまでに費やした時間をグーグルが節約できるように、この回答を追加するだけです。メインアセンブリから正しく検出されると想定して、/ targetplatformオプションを設定せずに.Net 4.0プロジェクトでILMergeを使用しました。その後、Windows XP、つまりWinXPでのみユーザーから苦情がありました。XPには> .Net 4.0がインストールされることはないので、これは理にかなっています。XPユーザーが問題を抱えている場合は、上記の修正を参照してください。


1

私の場合、Microsoft.ReportViewer.WebFormsの使用に関する問題がありました。私add verbはweb.configの行からvalidate = trueを削除し、それが機能し始めました:

<system.web>
    <httpHandlers>
      <add verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.