System.MissingMethodException : 메서드를 찾을 수 없습니까?


245

내 asp.net webforms 앱에서 한 번 작동했던 내용에 이제이 오류가 발생합니다.

System.MissingMethodException : 메서드를 찾을 수 없습니다

DoThis메소드는 동일한 클래스에 있으며 작동해야합니다.

다음과 같은 일반 처리기가 있습니다.

public class MyHandler: IHttpHandler
{
    public void Processrequest(HttpContext context)
    {
      // throws error now System.MissingMethodException: Method not found?
      this.DoThis(); 
    }

    public void DoThis()
    {
    //
    }
}

이 코드가 유효하지 않기 때문에 더 많은 코드를 게시 할 수 있습니다.
mironych

2
무엇입니까 somepage? '사운드'가 언급했듯이이 코드는 유효하지 않습니다. 문제를 보여주는 완전한 코드 스 니펫을 제공해주세요 .
Amy

답변:


388

이전 버전의 DLL이 여전히 어딘가에있을 때 발생할 수있는 문제입니다. 최신 어셈블리가 배포되어 있고 특정 폴더에 이전 어셈블리가 숨겨져 있지 않은지 확인하십시오. 가장 좋은 방법은 모든 빌드 된 항목을 삭제하고 전체 솔루션을 다시 빌드 / 재배치하는 것입니다.


62
특히 이전 버전이 GAC에 없는지 확인하십시오.
ladenedge

7
또한 라이브러리에 의존하거나 라이브러리 등에 의존하는 라이브러리가있는 불행한 경우에 작업하는 경우 동일한 버전의 dll을 사용하여 모든 종속 라이브러리를 정리 / 다시 빌드해야합니다 내 경우에는 NHibernate ...
Serj Sagan

2
프로젝트의 .NET 대상 프레임 워크를 업그레이드하면 오류를 해결할 수도 있습니다. .NET 4.5를 대상으로하는 MVC4 / Web API 1 프로젝트를 업그레이드하고있었습니다. 모든 MVC, Web API 및 Entity Framework 종속성을 업그레이드 한 후 동일한 오류가 발생했습니다. 대상 프레임 워크를 .NET 4.5.1로 변경하면 오류가 사라졌습니다.
Sergey K

1
변경된 exe 파일 만 배포하고 코드를 변경하지 않았기 때문에 도우미 dll을 배포하지 않았을 때 나에게 일어 났지만 다시 작성되었습니다. 다시 작성된 dll을 배포했는데 오류가 사라졌습니다. 변경되지 않은 dll을 다시 배포하지 않고 다른 배포를 수행했으며 문제가 없었으므로 여기에서 무슨 일이 있었는지 정확히 알 수 없습니다. 안전한 방법은 기본 코드 변경 여부에 관계없이 다시 빌드 된 파일을 배포하는 것입니다.
Ho Ho Ho

14
어셈블리가로드 된 위치를 확인하기 위해 디버깅 할 때 디버그-> Windows-> 모듈 창을 여는 것이 유용하다는 것을 알았습니다.
JamesD

32

⚠️ 잘못된 Nuget 패키지 버전 ⚠️

나는 우리 회사 내부 EF Nuget 데이터 액세스 패키지와 당기는 된 단위 테스트 프로젝트를했다 그 코드 에 뽑아 그 버전이었다 외부 패키지 방식으로 현재 버전 뒤에 있습니다.

문제는 패키지의 Nuget 설정이 least version; 이전 버전이 이겼으며 작업 중에 사용되었습니다 ....

따라서 패키지와 앱 모두에서 사용하는 공통 어셈블리에 대해 잘못된 버전자동으로 얻었습니다 .


💡 솔루션 💡

Nuget에서 패키지를 설정 / 업데이트 하여 최신 을 사용하고 [get] 함으로써 문제가 해결되었습니다.


1
이것은 나를 위해 그것을 고쳤다. 솔루션의 패키지 관리가 작동하지 않았지만 각 프로젝트를 개별적으로 업데이트해야했습니다.
aoakeson

단위 테스트 프로젝트는 실제 프로젝트보다 새로운 버전을 참조하고있었습니다
Rhyous

26

서버에 올바른 .NET Framework 버전을 설치하여이 문제를 해결했습니다. 웹 사이트는 버전 4.0에서 실행 중이며 호출하려는 어셈블리는 4.5로 컴파일되었습니다. .NET Framework 4.5를 설치하고 웹 사이트를 4.5로 업그레이드 한 후에는 모두 정상적으로 작동합니다.


2
.NET 3.5 컴파일 대상에 문제가 있고 .NET 3을 설치했습니다. 시작시 더 이상 기본 경고가없는 이유가 정말 궁금합니다 ...
Martin Meeser

.NET Framework 버전> 4.0의 경우 SKU (stock-keeping unit)를 지정해야하며, 앱이 대상으로하는 .NET Framework의 버전을 나타냅니다. docs.microsoft.com/ko-kr/dotnet/framework/configure-apps/…
bgcode

21

Visual Studio를 다시 시작하면 실제로 해결되었습니다. 오래된 어셈블리 파일이 여전히 사용 중이기 때문에 발생했다고 생각하고 "Clean Build"를 수행하거나 VS를 다시 시작하면 문제가 해결됩니다.


5

별도의 dll이 아닌 동일한 어셈블리에서 참조 된 파일 로이 문제가 발생했습니다. 프로젝트에서 파일을 제외하고 다시 포함하면 모든 것이 잘 작동했습니다.


5

방금 .NET MVC 프로젝트 에서이 문제가 발생했습니다. 근본적인 원인은 충돌하는 버전의 NuGet 패키지입니다. 여러 프로젝트가있는 솔루션이있었습니다. 각 프로젝트에는 NuGet 패키지가 있습니다. 한 프로젝트에는 Enterprise Library Semantic Logging 패키지 버전이 있었고 다른 두 프로젝트 (첫 번째 참조)에는 동일한 패키지의 이전 버전이있었습니다. 모두 오류없이 컴파일되지만 패키지를 사용하려고 할 때 신비한 "방법을 찾을 수 없음"오류가 발생했습니다.

수정은 두 프로젝트에서 이전 NuGet 패키지를 제거하여 실제로 필요한 한 프로젝트에만 포함되도록하는 것입니다. (또한 전체 솔루션을 깨끗하게 재구성했습니다.)


5

참조를 확인하십시오!

솔루션 프로젝트에서 동일한 타사 라이브러리 (버전을 신뢰하고 경로를 보지 말고)를 지속적으로 가리키고 있는지 확인하십시오.

예를 들어, 한 프로젝트에서 iTextSharp v.1.00.101을 사용하고 다른 곳에서 iTextSharp v1.00.102를 NuGet하거나 참조하는 경우 이러한 유형의 런타임 오류가 발생하여 코드에 영향을 줄 수 있습니다.

나는 3 가지 프로젝트 모두에서 동일한 DLL을 가리 키도록 iTextSharp에 대한 참조를 변경했으며 모든 것이 작동했습니다.


나를 위해 그것은 프로젝트를 정리하고 일부 참조를 삭제하고 다시 한 번 더 잘 처리했습니다.
Honza P.

VS 2017에서는 특히 참조 어셈블리의 출력 폴더가 아닌 솔루션의 다른 프로젝트의 출력 폴더에 소스 경로를 설정하는 참조를 제공하기 때문에 VS 2017에서 문제가됩니다.
Mr. TA

4

자체 NuGet 서버로 개발하는 경우 어셈블리 버전이 모두 같은지 확인하십시오.

[assembly: AssemblyVersion("0.2.6")]
[assembly: AssemblyFileVersion("0.2.6")]
[assembly: AssemblyInformationalVersion("0.2.6")]

어떻게 확인해야합니까?
SerG

나는 nupkg에서 생각합니다.
sennett


3

껐다가 다시 켰습니까? 농담을 제외하고 내 컴퓨터를 다시 시작하는 것이 실제로 나를 위해 트릭을 수행 한 것이며 다른 답변에는 언급되지 않았습니다.


3

방금이 문제가 있었고 UI 프로젝트에서 이전 버전의 DLL을 참조했기 때문에 발생했습니다. 따라서 컴파일 할 때 행복했습니다. 그러나 실행할 때 이전 버전의 DLL을 사용하고있었습니다.

솔루션을 재 구축 / 청소 / 재배치해야한다고 가정하기 전에 다른 모든 프로젝트에 대한 참조를 확인하십시오.


2

제 경우에는 복사 / 붙여 넣기 문제였습니다. 어떻게 든 매핑 프로파일에 대한 PRIVATE 생성자로 끝났습니다.

using AutoMapper;

namespace Your.Namespace
{
    public class MappingProfile : Profile
    {
        MappingProfile()
        {
            CreateMap<Animal, AnimalDto>();
        }
    }
}

(ctor 앞에서 누락 된 "공개"를 기록하십시오)

완벽하게 컴파일되었지만 AutoMapper가 프로파일을 인스턴스화하려고 시도하면 생성자를 찾을 수 없습니다!


@RenaudGauthier는 Jon Skeets의 답변에서 무언가를 잘못 읽었을 수도 있지만 액세스 수정자가없는 클래스는 내부적이며 주석에는 문자 그대로 "아니오. 그렇지 않습니다. 생성자를 선언하고 액세스 가능성을 지정하지 않으면 C # 사양의 섹션 10.3.5를 참조하십시오. 그래서 내 생성자가 결국 비공개라고 생각합니까? 내가 틀렸다면 정정 해주세요. 그리고 예 내 대답은 맥락에서 벗어났습니다. 나는 다른 질문 (나에게 답을 제공하지 않은)에서 여기에 왔습니다. 나는 거기에 내 답변에 대한 링크를 추가 할 것입니다.
DaBeSoft

당신은 절대적으로 맞아, 나도 모르게, 쓸모없는 의견을 삭제했습니다.
Renaud Gauthier

1

비슷한 예외가 발생하는 것과 비슷한 시나리오가있었습니다. 내 웹 응용 프로그램 솔루션에 DAL과 DAL.CustSpec이라는 두 가지 프로젝트가 있습니다. DAL 프로젝트에는 Method1이라는 메서드가 있지만 DAL.CustSpec에는 없습니다. 내 주요 프로젝트에는 DAL 프로젝트에 대한 참조와 AnotherProj라는 다른 프로젝트에 대한 참조가 있습니다. 내 주요 프로젝트는 Method1을 호출했습니다. AnotherProj 프로젝트에는 DAL 프로젝트가 아니라 DAL.CustSpec 프로젝트에 대한 참조가있었습니다. 빌드 구성에는 DAL 및 DAL.CustSpec 프로젝트가 모두 빌드되도록 구성되었습니다. 모든 것이 구축 된 후 내 웹 응용 프로그램 프로젝트의 Bin 폴더에 AnotherProj 및 DAL 어셈블리가있었습니다. 그러나 웹 사이트를 실행할 때 웹 사이트의 Temporary ASP.NET 폴더에는 DAL 어셈블리가 아닌 파일에 DAL.CustSpec 어셈블리가 있었고, 몇 가지 이유. 물론 Method1이라는 부분을 실행할 때 "Method not found"오류가 발생했습니다.

이 오류를 해결하기 위해해야 ​​할 일은 AnotherProj 프로젝트의 참조를 DAL.CustSpec에서 DAL로 변경하고 Temporary ASP.NET Files 폴더의 모든 파일을 삭제 한 다음 웹 사이트를 다시 실행하는 것이 었습니다. 그 후 모든 것이 작동하기 시작했습니다. 또한 빌드 구성에서 DAL.CustSpec 프로젝트를 선택 취소하여 빌드하지 않았는지 확인했습니다.

앞으로 다른 사람에게 도움이 될 때를 대비하여 이것을 공유하겠다고 생각했습니다.


1

ASP.NET 웹 사이트에서도 같은 상황이 발생했습니다. 게시 된 파일을 삭제하고 VS를 다시 시작한 후 프로젝트를 정리하고 다시 작성했습니다. 다음 게시 후 오류가 사라졌습니다 ...


1

작업 공간에서 https://visualstudiogallery.msdn.microsoft.com/f017b10c-02b4-4d6d-9845-58a06545627f )를 변경하고 선반 세트를 만들고 TFS Power Tools 'scorch'를 실행하여이 문제를 해결했습니다 . 그런 다음 변경 사항을 취소하고 프로젝트를 다시 컴파일했습니다. 이 방법으로 작업 공간에있을 수있는 '매달린 당사자'를 정리하고 새로운 것으로 시작합니다. 물론 TFS를 사용해야합니다.


1

누락 된 것으로보고 된 메소드 의 매개 변수 또는 리턴 유형 에 문제가있을 수 있으며 "missing"메소드 자체도 문제가되지 않습니다.

그것이 제 사건에서 일어난 일이며 잘못된 메시지로 인해 문제를 파악하는 데 훨씬 오래 걸립니다. 매개 변수 유형의 어셈블리에는 GAC의 이전 버전이 있지만 이전 버전의 버전 번호 체계가 변경되어 실제로 더 높은 버전 번호가있는 것으로 나타났습니다. GAC에서 이전 / 상위 버전을 제거하면 문제가 해결되었습니다.


1

Costura.Fody 1.6 & 2.0 사용 :
다른 모든 잠재적 솔루션이 작동하지 않는 동일한 종류의 오류를 조사하는 데 많은 시간을 낭비한 후, 포함하고 있던 DLL의 이전 버전이 실행중인 디렉토리와 동일한 디렉토리에 있음을 발견했습니다. 새로 컴파일 된 .exe from. 분명히 동일한 디렉토리에서 로컬 파일을 먼저 찾은 다음 내장 라이브러리를 찾습니다. 이전 DLL을 삭제했습니다.

분명히, 내 참조가 오래된 DLL을 가리키는 것이 아니라, 오래된 DLL의 사본이 응용 프로그램을 컴파일 된 별도의 시스템에서 테스트하는 디렉토리에 있다는 것이 었습니다.


1

내 경우에는 경로가 명시 적으로 제공되었지만 동일한 DLL의 여러 버전이 충돌했기 때문에 내 .csproj 파일에서 참조 된 것과 동일한 이름의 더 오래된 DLL이있는 폴더였습니다.



1

필자의 경우 MissingMethodException은 동일한 파일에있는 메소드에 대한 것입니다!

그러나 방금 4.7.1 대상 프로젝트에 .Net Standard2를 사용하는 NuGet 패키지를 추가하여 System.Net.Http (4.7.1 : 버전 4.0.0.0, .NET을 사용하는 NuGet 패키지)의 버전 충돌이 발생했습니다. 표준 2는 4.2.0.0을 원합니다). 이것은 4.7.2에서 개선되어야 하는 알려진 문제인 것 같습니다 (주 2 참조) .

내가 가지고 있지 않은 4.2.0.0을로드하려고하자마자 예외가 있었기 때문에 다른 모든 프로젝트에서 이와 같은 바인딩 리디렉션을 사용했습니다.

  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>

이 프로젝트를 제외하고 는 System.Net.Http.HttpResponseMessage를 매개 변수 또는 반환 유형으로 사용하는 로컬 함수를 호출하는 동안에 만 System.Net.Http를로드하려고하는 것 같습니다 (디버깅 중 매개 변수, 실행할 때 반환 유형 디버거가없는 테스트도 약간 이상합니다). 4.2.0.0 버전의 System.Net.Http를로드 할 수 없다는 메시지를 표시하는 대신이 예외를 반환합니다.


0

이것은 MVC4를 사용하여 나에게 발생 했으며이 스레드를 읽은 후에 오류가 발생한 객체의 이름을 바꾸기로 결정했습니다.

나는 깨끗하고 재건축했으며 두 프로젝트를 건너 뛰고 있다고 언급했다. 그중 하나를 다시 만들 때 함수를 시작했지만 완료하지 않은 오류가 발생했습니다.

그래서 VS는 내가하고 싶은지 묻지 않고 다시 작성한 모델을 참조하고있었습니다.


0

오래된 문제이지만 누군가에게 도움이되는 경우 내 문제는 약간 이상했습니다.

Jenkins를 사용하는 동안이 오류가 발생했습니다.

결국 시스템 날짜가 미래 날짜로 수동 설정되어 dll이 해당 미래 날짜로 컴파일되는 것을 알았습니다. 날짜가 다시 정상으로 설정되면 MSBuild는 파일이 최신 버전이며 프로젝트를 다시 컴파일 할 필요가없는 것으로 해석했습니다.


0

나는이 문제에 부딪 쳤고, 한 프로젝트는 Example.Sensors 네임 스페이스에있는 List를 사용하고 다른 유형은 ISensorInfo 인터페이스를 구현하는 것이 었습니다. Type1SensorInfo 클래스이지만이 클래스는 Example.Sensors.Type1의 네임 스페이스에서 한 계층 깊었습니다. Type1SensorInfo를 목록으로 직렬화 해제하려고 할 때 예외가 발생했습니다. Example.Sensors.Type1을 사용하여 ISensorInfo 인터페이스에 추가했을 때 더 이상 예외는 없습니다!

namespace Example
{
    public class ConfigFile
    {
        public ConfigFile()
        {
            Sensors = new List<ISensorInfo<Int32>>();
        }
        public List<ISensorInfo<Int32>> Sensors { get; set; }
     }
   }
}

**using Example.Sensors.Type1; // Added this to not throw the exception**
using System;

namespace Example.Sensors
{
    public interface ISensorInfo<T>
    {
        String SensorName { get; }
    }
}

using Example.Sensors;

namespace Example.Sensors.Type1
{
    public class Type1SensorInfo<T> : ISensorInfo<T>
    {
        public Type1SensorInfo() 
    }
}

0

효과적으로 충돌 한 백그라운드에서 많은 MSBuild 프로세스를 실행했을 때도 동일한 일이 발생했습니다 (이전 버전의 코드에 대한 참조가 있음). VS를 닫고 프로세스 탐색기에서 모든 MSBuild 프로세스를 종료 한 다음 다시 컴파일했습니다.


0

동일한 dll의 다른 버전 (다른 위치)을 각각 참조하는 2 개의 다른 프로젝트를 참조하는 테스트 프로젝트가 있습니다. 이것은 컴파일러를 혼란스럽게했습니다.


0

내 경우 spotify.exe는 웹 api 프로젝트가 개발 컴퓨터에서 사용하려는 것과 동일한 포트를 사용했습니다. 포트 번호는 4381입니다.

나는 Spotify를 종료하고 모든 것이 다시 잘 작동했습니다 :)



0

필자의 경우 코드 변경이 전혀 없었으며 갑자기 서버 중 하나 가이 예외를 가져 오기 시작했습니다 (모든 서버에는 동일한 코드가 있지만 하나만 문제가 발생했습니다).

System.MissingMethodException: Method not found: '?'.

스택:

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at myAccountSearch.AccountSearch.searchtPhone(searchtPhoneRequest request)
   at myAccountSearch.AccountSearchClient.myAccountSearch.AccountSearch.searchtPhone(searchtPhoneRequest request)
   at myAccountSearch.AccountSearchClient.searchtPhone(String ID, String HashID, searchtPhone Phone1)
   at WS.MyValidation(String AccountNumber, String PhoneNumber)

내가 믿었던 문제는 AppPool이 손상되었다고 생각합니다. 우리는 매일 오전 3시에 AppPool 재활용을 자동화했으며이 문제는 오전 3시에 시작하여 다음 날 오전 3시에 끝났습니다.


0

Microsoft의 참조 버그 여야합니다.

모든 라이브러리를 정리하고 다시 빌드했지만 여전히 같은 문제가 발생하여 해결할 수 없었습니다.

내가 한 모든 Visual Studio 응용 프로그램을 닫고 다시 열었습니다. 그 트릭을했다.

그런 간단한 문제를 해결하는 데 오랜 시간이 걸릴 수 있다는 것은 매우 실망스러운 일입니다.


0

제 경우에는 제 프로젝트가 참조하고 Microsoft.Net.Compilers.2.10.0있었습니다. 로 전환 Microsoft.Net.Compilers.2.7.0하면 오류가 사라졌습니다. 그런 다양한 원인에 대한 신비로운 오류.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.