web-dev-qa-db-ja.com

C#で拡張メソッドを使用するとエラーが発生する

3.0フレームワークにバグがあると思わせる問題に遭遇しました。拡張メソッドを使用しようとすると、次のエラーが表示されます。

Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'

この単純なコードを使用する場合:

public static class StringUtils {
    static void TestExtension(this String targetString) {

    }
}

このコンパイルエラーをなくす唯一の方法は、次のコードを追加することです。

namespace System.Runtime.CompilerServices {
    public class ExtensionAttribute : Attribute { }
}

拡張メソッドを使用してから数か月が経ちましたが、これを行う必要はないと確信しています。他の誰かがこの問題に遭遇しましたか?

56
Korbin

私は自分でこの問題に遭遇しました。私の場合、VS 2005/.Net 2.0プロジェクトをVS 2008/.Net 3.5プロジェクトに変換したためです。変換ツールはSystem.Core 2.0への参照を保持していましたが、System.Core 3.5への参照を簡単に変更する方法を見つけることができませんでした。

最終的にVS 2008でプロジェクトを最初から再作成しましたが、System.Core 3.5への適切な参照で作成されました

20
abelenky

私はまったく同じ問題を抱えています。エラー System.Runtime.CompilerServices.ExtensionAttribute..ctorはかなり不可解であり、多くの異なるものを意味する可能性があります。

しかし、私にとっては、Newtonsoft.Json.Net。ファイルへの参照を削除しましたNewtonsoft.Json.Net20.dll、およびそれを再追加しました。この後、私のソリューションが再び構築されます。

最も奇妙なことは、この手順の後にSubversion Diffを使用して何が変わったのかを調べようとしても、何も変わっていないように見えることです。

したがって、この参照の削除と再追加が実際に何をするのかは本当にわかりませんが、askerによって言及されたこの特定のエラーメッセージで私のビルドの問題を修正します。

更新1

再びこれに出くわした人たちは、メンターが指摘したように、これを修正する適切な方法はJson.NetのZipをダウンロード であり、3.5バージョン、Json.Netを使用しているすべての場所で3.5を再参照し、古い参照を削除します。古い参照は.net。の古いバージョン用に構築されたアセンブリを参照している可能性が高いためです

更新2

Charlie Flowers は、DLL 3.5であるというNewtonSoftラベルは、実際には3.5では動作しないことを指摘しています。DLL彼らは.net 2.0向けであるとラベル付けしています

73
7wp

vSで、[プロジェクト]([ファイル]、[編集]、[表示]の横)をクリックし、[プロパティ]を選択します。

次に、[アプリケーション]タブ(既に3.5にいることに気付くでしょう)で、Target Frameworkを2.0に選択してからコンパイルします(エラーになります)。その後、3.5に戻し、再度コンパイルすると、エラーが消えます

私はそれがVisual Studioの小さな不具合だと思う、ただIDE :-)をだます

17
Michael Buen

VS 2008からVS 2010 Beta 2にアップグレードしたクラスライブラリプロジェクトで同じ問題が発生しました。アップグレード後までプロジェクトに拡張メソッドを追加しなかったため、同じエラーが表示され始めました。

次のコードを持つクラスをプロジェクトに追加すると、問題が解決しました。

namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}

このブログでヒントを見つけました: http://blog.flexforcefive.com/?p=105

16
Andrew Myhre

あなたのフレームワークは、拡張メソッドに対して十分に高くありません。
これは hack であり、拡張メソッドを3.5にならずに動作させるためのものです。

5
Tom Ritter

どのバージョンの.NETをターゲットにしていますか? ExtensionAttributeクラスはSystem.Core.dll(.NET 3.5)に同梱されていますが、.NET 2.0/3.0(明らかにC#3.0を使用)で拡張メソッドを使用する場合は、自分で再宣言できます。実際、 LINQBridge がこれを行います。

[更新]ただし、shouldに表示されるエラーは次のとおりであるため、少し混乱しています。

エラー1コンパイラに必要なタイプ 'System.Runtime.CompilerServices.ExtensionAttribute'が見つからないため、新しい拡張メソッドを定義できません。 System.Core.dllへの参照がありませんか? [いくつかのパスを抜粋]

3
Marc Gravell

System.Core参照がないと、これらの症状が現れます。

2
jyoung

継続的な参照:

.Net 4.0フレームワークで過去2時間にわたってこのまったく同じエラーメッセージと戦い、最終的にMicrosoft.CSharp dllへの破損した参照を追跡しました。それはとてもイライラするほど単純な問題でした。問題の参照を削除し、次の場所にあるdllに「新しい」参照を追加しました。

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll

うまくいけば、このエラーメッセージの解決策を追跡する時間と悪化を他の誰かに節約できます。

1
DJGray

この問題は、System.Coreのバージョン2への誤った参照が原因です。これは通常、以前のバージョンの.NETから.NET 3.5にアップグレードするときに発生します。この問題が発生しているWebサイトの場合は、以下の手順に従って修正できます。

1)web.configでSystem.Core v3.5への参照を追加します。

<assemblies>
   <add Assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>

2)web.configで、構成の子として次を追加します。

<configuration>
   <!--Some other config-->
   <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
         <assemblyIdentity name="System.Core" publicKeyToken="B77A5C561934E089"/>
         <bindingRedirect oldVersion="2.0.0.0-2.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
   </assemblyBinding>
</configuration>
1
lexx

試してみてください:プロジェクト、参照の追加、リストでSystem Core 3.5.0.0を見つけ、OKで追加します。

0
Larry

VSプロジェクトを.NET framework 3.5以上にターゲットするだけです。ほとんどの場合、以前のバージョンからプロジェクトを変換しました。

0
Hash

Csprojを編集し、それらの参照が含まれていることを確認します(単純な「参照の追加」では機能しません...):

<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
0
Eli Livshitz

拡張機能はC#3.0で導入されましたが、これは.NET 3.5で導入されたため、.NET 3.0で直接使用することはできません。

0
Tamas Czinege

これは偶然にWebサイトプロジェクトですか?ターゲットフレームワークを.NET 3.5から以前のバージョンに変更してから、.NET 3.5に戻します。

0

私の場合、理由はMicrosoftのAntiXSSLibrary.dllのNET20バージョンが間違っていたためです。 NET35に置き換えられました-エラーはなくなりました。

0
Denis

既存の.Net 4.0プロジェクトで.net 2.0をターゲットにしたバージョンのElmah.Sandboxがありました。プロジェクトに拡張メソッドを追加すると、「Missing compiler required member」エラーメッセージでビルドが失敗しました。

Elmah.Sandbox dllは、ElmahRの初期バージョンの一部として含まれていました。これが削除されると、すべて再構築されました。

0
Gais