Nice programing

C #에서 확장 메서드를 사용할 때 오류

nicepro 2020. 12. 28. 22:33
반응형

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 { }
}

확장 메서드를 사용한 지 몇 달이 지났지 만이 작업을 수행 할 필요가 없었습니다. 다른 사람이이 문제를 겪은 적이 있습니까?


이 문제를 직접 만났습니다. 제 경우에는 VS 2005 / .Net 2.0 프로젝트를 VS 2008 / .Net 3.5 프로젝트로 변환했기 때문입니다. 변환 도구는 System.Core 2.0에 대한 참조를 유지했으며 System.Core 3.5에 대한 참조를 변경하는 쉬운 방법을 찾을 수 없었습니다.

나는 VS 2008에서 처음부터 프로젝트를 다시 만들었고 System.Core 3.5에 대한 적절한 참조로 만들어졌습니다.


나는 똑같은 문제가 있습니다. 오류 System.Runtime.CompilerServices.ExtensionAttribute..ctor는 다소 모호하며 여러 가지 의미를 가질 수 있습니다.

그러나 나를 위해 그것은 내가 사용하고 있다는 사실로 요약됩니다 Newtonsoft.Json.Net. 파일에 대한 참조를 제거하고 Newtonsoft.Json.Net20.dll다시 추가했습니다. 이 후 내 솔루션이 다시 빌드됩니다.

가장 이상한 점은 Subversion Diff를 사용하여이 절차를 수행 한 후 무엇이 다른지 알아 내려고했을 때 아무것도 변경되지 않은 것 같습니다.

따라서이 참조를 제거하고 다시 추가하는 것이 실제로 어떤 역할을하는지 잘 모르겠지만 질문자가 언급 한 특정 오류 메시지로 빌드 문제를 해결합니다.

업데이트 1 :

이 문제를 다시 겪는 사람들을 위해 comenters가 지적했듯이 이것을 수정하는 적절한 방법은 Json.Net의 ZIP다운로드 하는 것입니다. 3.5 버전이 있어야하며 Json.Net을 사용하는 모든 곳에서 3.5를 다시 참조하고 삭제합니다. .net의 이전 버전 용으로 빌드 된 어셈블리를 참조 할 가능성이 있으므로 이전 참조.

업데이트 2 :

Charlie Flowers 는 3.5 용 DLL NewtonSoft 라벨이 실제로 3.5에서는 작동하지 않을 것이라고 지적합니다. .net 2.0 용으로 표시된 DLL을 사용해야합니다.


VS에서 프로젝트 (파일, 편집,보기 옆)를 클릭하고 속성을 선택합니다.

그런 다음 Application 탭 (이미 3.5에 있음을 알 수 있음)에서 Target Framework를 2.0으로 선택한 다음 컴파일하십시오 (오류가 발생 함). 그런 다음 다시 3.5로 설정 한 다음 다시 컴파일하면 오류가 사라집니다.

나는 그것이 Visual Studio의 작은 결함이라고 생각합니다. IDE를 속이십시오 :-)


VS 2008에서 VS 2010 Beta 2로 업그레이드 한 클래스 라이브러리 프로젝트에서 동일한 문제가 발생했습니다. 업그레이드가 끝날 때까지 프로젝트에 확장 메서드를 추가하지 않았는데 같은 오류가 발생하기 시작했습니다.

프로젝트에 다음 코드로 클래스를 추가하면 문제가 해결되었습니다.

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

이 블로그에서 팁을 찾았습니다 : http://blog.flexforcefive.com/?p=105


프레임 워크가 확장 메서드에 대해 충분히 높지 않습니다. 3.5에 있지 않고 확장 메서드를 작동
시키는 해킹 입니다.


어떤 버전의 .NET을 타겟팅하고 있습니까? ExtensionAttribute 클래스는 System.Core.dll (.NET 3.5)에 포함되어 있지만 .NET 2.0 / 3.0 (C # 3.0 포함)에서 확장 메서드를 사용하려는 경우 직접 다시 선언 할 수 있습니다. 실제로 LINQBridge 는이를 수행합니다.

[업데이트] 그러나 표시 해야하는 오류는 다음과 같기 때문에 약간 혼란 스럽습니다 .

오류 1 컴파일러 필수 형식 'System.Runtime.CompilerServices.ExtensionAttribute'를 찾을 수 없기 때문에 새 확장 메서드를 정의 할 수 없습니다. System.Core.dll에 대한 참조가 누락 되었습니까? [일부 경로 물건을 잘라 냄]


System.Core 참조가 누락되면 이러한 증상이 나타납니다.


이 문제는 실제로 System.Core 버전 2에 대한 잘못된 참조로 인해 발생합니다. 이는 일반적으로 이전 버전의 .NET에서 .NET 3.5로 업그레이드 할 때 발생합니다. 이 문제가 발생한 웹 사이트 인 경우 아래 단계에 따라 해결할 수 있습니다.

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>

지속적인 참조를 위해 :

나는 .Net 4.0 프레임 워크에서 지난 2 시간 동안 똑같은 오류 메시지와 싸우고 마침내 Microsoft.CSharp dll에 대한 손상된 참조를 추적했습니다. 너무나도 단순한 문제였습니다. 문제가되는 참조를 삭제하고 다음 위치에있는 해당 dll에 "새"참조를 추가했습니다.

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

바라건대 이것은 다른 누군가가이 오류 메시지에 대한 해결책을 추적하는 시간과 악화를 줄여 줄 것입니다.


Extensions are introduced in C# 3.0, which on the other hand was introduced in .NET 3.5 so you can't really use them in .NET 3.0 directly.


Is this a web site project, by chance? Try changing the target framework from .NET 3.5 to an earlier version, and then back to .NET 3.5.


Try: Project, Add Reference, find System Core 3.5.0.0 in the list, and OK to add it.


Just target your VS project to .NET framework 3.5 and above. Most probably you converted your project from a previous version.


I had a version of Elmah.Sandbox that was targetting .net 2.0 in an existing .Net 4.0 project. I added an extension method to my project and the build failed with the "Missing compiler required member" error message.

The Elmah.Sandbox dll was included as part of an early version of ElmahR. Once this was removed, it all built again.


In my case the reason was the wrong NET20 version of Microsoft's AntiXSSLibrary.dll. Replaced with NET35 - the error is gone.


Edit your csproj and make sure those references are included (it wont work by simple 'add reference'...):

<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" />

ReferenceURL : https://stackoverflow.com/questions/205644/error-when-using-extension-methods-in-c-sharp

반응형