149

初めて 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'.
4

11 に答える 11

265

アセンブリ 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 がリリースされた今、絶対に不可欠です。

于 2012-12-06T18:29:04.687 に答える
11

ロードできなかったタイプがSystem.Reflection.AssemblyMetadataAttributeであることを除いて、私はこの問題を抱えていました。Web アプリケーションは、ターゲット フレームワークとして 4.0 を使用して、.NET 4.5 がインストールされた (そこで正常に動作する) マシン上に構築されましたが、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 がインストールされていないマシンでアプリケーションをビルドすることができます。理想的な解決にはほど遠い。

于 2013-11-26T20:56:57.190 に答える
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>
于 2014-02-12T19:36:02.973 に答える
6

今日、この厄介な問題に遭遇しました。SmartAssembly を使用して .NET アセンブリを圧縮/難読化しましたが、突然最終製品がテスト システムで動作しなくなりました。.NET 4.5 を持っているとは思いもしませんでしたが、どうやら 1 か月ほど前に誰かがインストールしたようです。

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

于 2014-02-14T01:43:30.990 に答える
2

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

宛先には、まだ .NET 4.5 を参照している古いアセンブリがいくつかあったことが判明しました。

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

于 2014-07-03T19:57:33.237 に答える
1

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

于 2016-08-17T02:04:11.747 に答える
1

私の場合、TeamCity マシンで見逃したのは Blend SDK でした。これにより、アセンブリの解決方法が正しくないためにエラーが発生しました。

于 2015-10-19T12:55:26.037 に答える