programing

런타임에 메서드를 찾을 수 없습니다.

javajsp 2023. 10. 26. 20:46

런타임에 메서드를 찾을 수 없습니다.

ASP 있어요.다른 프로젝트의 클래스에서 메서드에 액세스하려고 하는 Netc# 프로젝트입니다.반의 반에는 효과가 있지만 최근에 추가한 반의 반에는 효과가 없습니다.컴파일하지만 런타임에 메서드를 찾을 수 없습니다.

제가 시도해 볼만한 아이디어가 있는 사람?시도해 봤습니다.

  1. 재창조하기.sln파일
  2. 내가 아는 다른 도서관 프로젝트에서 서브를 하는 것.다른 프로젝트의 메소드를 호출하는 제 메인 프로젝트에 오류가 있는 것 같습니다.

"메소드를 찾을 수 없음"은 매우 구체적인 오류이며, 이는 메소드가 예상했던(즉, 컴파일 시간에 존재하지 않음) 단순히 존재하지 않음을 의미합니다.이것은 일반적으로 배포 중인 파일이 생각하는 파일과 다르다는 것을 의미합니다. 특히 이전 버전의 라이브러리를 배포하는 것은 (추가된 파일이 없는)

웹 서버에 배포된 dll을 사용자가 생각하는 것과 비교하여 확인합니다.

저도 같은 문제가 있었습니다.제 경우에는 [선택적 논변][1]이 추가되어 발생했습니다.그래서 먼저 다음과 같은 것을 갖게 됩니다.

참조어셈블리:

referencedAssembly.DoStuff(firstArgument, secondArgument)

참조어셈블리:

public void DoStuff(string firstArgument, string secondArgument)
{
   //stuff to do
}

그런 다음 메서드에 선택적 매개 변수를 추가하지만 메서드를 호출하는 동안에는 해당 인수를 제공하지 않습니다.

참조어셈블리:

referencedAssembly.DoStuff(firstArgument, secondArgument)//unchanged

참조어셈블리:

public void DoStuff(string firstArgument, string secondArgument, string thirdArgument = "default value")
{
   //stuff to do
}

새로 빌드된 Assembly.dll 참조는 DoStuff(string, string, string) 메서드를 참조하므로 로컬에서 빌드되고 잘 실행됩니다.그러나 변경된 referenceAssembly만 배포하는 경우(생각: 추가된 인수는 선택 사항이고 참조Assembly는 여전히 작동), 이전 버전의 referenceAssembly는 서명 DoStuff(string, string)로 메서드를 찾기 때문에 MethodNotFound를 생성합니다.추가(선택사항) 인수를 추가한 이후 참조된 Assembly에 더 이상 존재하지 않습니다.


가능한 해결책은 과부하일 수 있습니다.

참조어셈블리:

public void DoStuff(string firstArgument, string secondArgument)//original method
{
   DoStuff(firstArgument, secondArgument, "default value")
}
public void DoStuff(string firstArgument, string secondArgument, string thirdArgument)//new overload of the method
{
//stuff to do
}

또는 새로 빌드한 참조 Assembly(Signature DoStuff(string, string, string))를 배포합니다.[1]: https://msdn.microsoft.com/en-us/library/dd264739.aspx

당신의 솔루션에는 프로젝트 A와 프로젝트 B 두 개의 프로젝트가 있습니다.두 프로젝트 모두 nuget 패키지 "DoStuff"를 사용하지만 DoStuff 패키지의 다른 버전은 다음과 같습니다.

  • 프로젝트 A는 DoStuff 버전 1.1을 참조합니다.
  • 프로젝트 B는 DoStuff 버전 1.0을 참조합니다.
  • 프로젝트 B는 프로젝트 A를 참조합니다.

버전 1.1에는 프로젝트 A에서 사용되는 새로운 방법이 있습니다. 프로젝트 B가 프로젝트 A를 사용할 때 프로젝트 B 버전의 DoStuff는 A가 어떤 프로젝트를 이야기하는지 모르기 때문에 이 MethodNotFoundException을 받게 됩니다.

이를 방지하기 위해 프로젝트가 동일한 nuget 패키지의 다른 버전을 사용하는 경우 실패하는 단위 테스트를 실시하고 있습니다.비교적 간단한 도어 스톱 덕분에 지난 몇 년간 몇 번의 두통을 덜 수 있었습니다.

저는 이런 문제에 직면했지만 해결할 수 있었습니다.빈과 디버그 폴더를 비우고 프로젝트를 다시 구축하려고 했습니다.적어도 저한테는 효과가 있었어요아니면 용액을 깨끗이 하고 다시 만드는 것을 시도해 보세요.물론 코드의 일부를 게시하는 것이 더 도움이 될 수 있습니다.

webconfig에서 optimizeCompilations를 false로 설정한 나의 경우에도 같은 문제가 있었습니다.

저는 매우 비슷한 문제가 있었고, GAC에 이전 버전의 조립품이 설치되어 있다는 것을 발견했습니다.그 버전을 제거한 후 프로젝트가 컴파일되고 제대로 실행되었습니다.그래서 GAC를 확인합니다(C:\Windows\Assembly그것이 거기에 기재되어 있지 않은지 확인합니다.

저도 이와 같은 예외를 겪었습니다. 제 문제는 달랐지만 원래 제 라이브러리 중 하나에 다음과 같은 방법이 있었습니다.

public void WriteMessage(string msg) 
{
    ...
}

새로운 수정 요청이 있었고, 이는 다음과 같이 변경되었습니다.

public void WriteMessage(string msg, int code = 100)
{
    ...
}

그 후, 새로 컴파일된 바이너리로 이 라이브러리를 사용하는 프로젝트를 업데이트했는데, 이 예외를 버리기 시작했습니다.

여러 번 시도했지만 아무 것도 작동하지 않았고 심지어 프로젝트를 클린, 리빌드, 참조를 제거하고 다시 추가한 후 프로젝트의 메소드 호출을 다음에서 수정하려고 했습니다.

...
library.WriteMessage('hello!');
...

대상:

...
library.WriteMessage('hello!', 100);
...

프로젝트를 컴파일한 다음 문제를 해결하고 다시 다음과 같이 변경했습니다.

...
library.WriteMessage('hello!');
...

이제 마법처럼 모든 것을 해결했습니다. 업데이트되지 않는 캐시된 메타데이터가 어딘가에 남아 있을 수도 있습니다. 메소드를 호출하는 방식을 변경함으로써 메소드의 서명은 다르지만 그다지 다르지 않다는 것을 명확하게 상기시킬 수 있습니다.

이것이 제가 겪었던 것과 같은 문제에 직면한 누군가에게 도움이 될 수 있기를 바랍니다.

봐요, 이게 지금까지 중에 가장 이상한 원인임에 틀림없지만, 아침 내내 모든 것을 시도하고 프로젝트를 처음부터 다시 만드는 등의 노력을 한 결과, 문제를 피할 수 있는 유일한 것은 내 도서관이 다른 어셈블리 이름을 가지고 있다는 것을 알게 되었습니다.

나는 GAC에 이전의 dll 버전을 설치했다는 끔찍한 제안을 마음속에서 받았지만, 그것을 이미 확인했고, 게다가 그것은 결코 내 의도가 아니었습니다.그러나 그 추적을 따라 C:\Program Files(x86)\Microsoft Visual Studio 10.0에 설치된 이 dll(및 프로젝트의 다른 모든 dll!)을 알게 되었습니다.\공통7\IDE!!!!

으악! 나만 어떻게든 이 일을 망친 것 같은데, 왜 그런지 모르겠어, 나는 단지 누군가가 그렇게 운이 없을 수도 있다는 먼 가능성 속에서 다른 누군가에게 이런 좌절감을 덜어줄 수 있을 것 같아서!!

nuget package managed dlls로 애플리케이션을 실행할 때도 같은 문제가 발생했습니다.nuget package manager에서 dll을 업데이트하려고 하면 테스트 레이어가 업데이트되지 않는 것으로 나타났습니다.당신이 말하는 dll의 버전을 확인하는 것을 제안합니다.VS의 ObjectBrower로 이동하여 dll을 확인하고 참조 위치를 확인합니다. 최신 dll을 참조하고 있는지 확인합니다.

제 경우는 여기에 있는 다른 것들의 약간의 변형이었지만 누군가에게 도움이 될지도 모릅니다.방금 라이브러리에 선택적 인수를 추가했고 라이브러리를 사용한 GUI에서 메시지를 받았습니다.

GUI와 해당 라이브러리 중 하나가 동일한 라이브러리를 참조하지만 하나가 최신 상태가 아니었기 때문에 문제가 발생했습니다.

있습니다

  • LibA 및 LibZ 참조 GUI
  • LibA LibZ 참조

그래서 LibA와 GUI 모두의 "bin"과 "obj" 폴더를 모두 제거하고 LibZ의 업데이트된 DLL을 둘 다 확실히 했고 모든 것이 다시 작동했습니다.

늦은 응답일 수 있습니다.하지만 한 가지 가능한 해결책은 임시 ASP를 정리하는 것입니다.NET 파일 폴더: C:\Windows\Microsoft.NET\Framework\vX.X.XXXXX\임시 ASP.NET 파일

웹 사이트와 관련된 폴더를 삭제하고 솔루션을 재구성합니다.

다른 프로젝트를 참조하는 경우.exe, 다음과 같이 재구축해야 합니다..dll, 이 작업을 수행하려면 참조된 프로젝트를 다음으로 설정해야 합니다.class library프로젝트 설정으로 빌드한 다음 프로젝트에 dll을 참조하면 메서드가 누락되었습니다.

파티에 조금 늦었습니다.

GAC의 내용을 확인합니다.

.dll이 이미 있는 경우 제거해야 합니다.

developer 명령 프롬프트를 admin으로 실행하고 다음을 입력합니다.

gacutil -u {name of your dll}

저도 같은 문제가 있었는데 메소드 이름을 다른 이름으로 바꾸고 레퍼런스도 바꿨습니다.그 다음엔 아주 잘 됐어요.무엇이 문제였는지는 모르겠지만, 전체 시스템에 적용되지 않은 상황에서 메소드 이름을 변경할 때 버그가 발생하는 것 같습니다.

저는 같은 문제에 직면했고, 심지어 솔루션을 청소하고 다시 구축했지만 도움이 되지 않았습니다.애플리케이션을 게시했을 때 이전 버전의 dll이 bin 폴더에 있었습니다.그래서 assembly info 파일에서 assembly 버전을 변경했습니다.드디어 작동하기 시작했습니다.새 버전은 bin 폴더에서 사용할 수 있습니다.

방금 이 문제가 있었습니다.

프로젝트 X는 다른 프로젝트에서 사용하는 라이브러리로, dll Y를 포함합니다.프로젝트 A는 이전 버전의 dll Y를 포함하고 있으며, 프로젝트 A는 프로젝트 X의 dll Y에서 코드를 호출합니다.

해당 dll에서 코드를 호출할 때 이전 버전의 dll이 사용되었습니다.반면에 dll Y가 참조되지 않은 다른 프로젝트는 프로젝트 X에서 최신 dll Y를 사용했습니다.

포함된 모든 프로젝트에서 dll/nuget 패키지를 업데이트해야 합니다.

Action as parameter가 있을 때도 오류가 발생했습니다.메소드를 새 Action(...)으로 포장하지 않고 전달했습니다.

DLL에는 다음이 있습니다.

public bool ShowMyForm(bool showConnectionWindow, Action onCloseNotify) {...}

DLL이라고 불리는 테스트 앱은 다음과 같습니다.

private void onFormClose()
{
    MessageBox.Show("Form Closed");
}

private void ShowForm()
{
     mydll.ShowMyForm(true, onFormClose ); // bug here: wrap in Action
}

통화를 다음으로 변경했을 때

mydll.ShowMyForm(true, new Action(onFormClose) );

예외가 사라졌습니다.예외 텍스트는 오해의 소지가 있습니다. 메서드가 있지만 매개 변수의 유형이 런타임 예외를 제공했습니다.하지만 컴파일 시간에 픽업이 되지 않는 것이 안타깝습니다.

제 경우에는 에 배치했습니다.컴파일 대상은 NET 3.0 PC(Windows XP)입니다.NET 3.5.왜 더 기본적인 경고가 없는 건지 정말 의문입니다.

시스템에서 데이터 계약을 사용하는 것이 문제가 되었습니다.런타임.직렬화.

솔루션을 다른 컴퓨터의 다른 위치에 복사했을 때 이 문제가 발생했습니다.빌드 폴더를 변경해야 했습니다.이유를 묻지는 않지만 빌드 폴더에 솔루션이 구축된 다음(이 폴더를 A라고 부르겠습니다) B 폴더에서 C 폴더로 이전 복사본이 복사되었습니다.실행 시 C 폴더의 이전 버전을 보고 있었기 때문에 최신 코드를 찾을 수 없었습니다.빌드 탭의 솔루션 속성에서 출력 경로를 B 폴더로 변경했습니다.그런 다음 B 폴더에 최신 버전을 구축하고 C 폴더에 복사하여 다시 작동했습니다.

제가 잘 모르는 부분은 우리가 왜 애초에 C 폴더를 가지고 있는지 입니다.코드가 있어요UI 테스트 솔루션 및 폴더 C는 "C:\Users\\Documents\MyCodedUIS 솔루션\테스트 결과\_ 2017-04-2011_31_29\Out".이것이 무엇에 사용되고 왜 생성되는지는 모르겠지만 출력 경로를 변경하거나 필요한 대로 출력 경로를 변경하지 않고 솔루션을 이동하기 때문에 이전 코드가 여기에 복사되면 문제가 발생합니다.

제 경우에는 방법의 반환 유형을 Iqueryable에서 IE numberable로 변경했습니다.

메소드가 포함된 DLL을 다시 컴파일해서 올렸는데 메소드를 호출하는 코드가 포함된 DLL은 업로드하지 않았습니다.그래서 호출 DLL은 이전 반환 유형의 메서드를 여전히 예상하고 있었고 찾을 수 없었습니다.

제안된 어떤 답변도 수정하지 못했습니다.사용자 정의 어셈블리의 이전 버전을 찾을 수 없습니다.저는 말 그대로 Everything이라는 도구로 모든 곳을 뒤졌습니다.디버그 모드에서는 올바른 버전의 어셈블리를 보여주었지만 여전히 메서드를 찾을 수 없습니다.

에서 자동 바인딩 사용.csproj파일로 고쳐 줬습니다.

<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

나는 의 소포를 목표로 하고 있었습니다.제 프로젝트의 NET Framework 4.5입니다.프로젝트의 모든 패키지가 대상인 경우에는 위의 설정이 필요하지 않습니다.NET Framework 4.5.1 이상.

Nirman의 답변 외에도 - 에서 임시 파일을 지우는 것을 잊지 마십시오.C:\Users\UserName\AppData\Local\Temp\Temporary ASP.NET Files위치.

클래스 필드 유형을 열거형에서 문자열로 변경한 후 오류가 발생했습니다.

System.MissingMethodException:메서드를 찾을 수 없습니다. 'DatnesVeidiDatnesModel.get_DatnesVeids()'

Razor view를 렌더링할 수 있습니다.이전 제안 중 아무 것도 도움이 되지 않았고, 단지 사용자 로컬 임시 파일을 지웠습니다.

나중에 이 질문을 방문하는 다른 사람들은 다음과 같습니다.

다른 프로젝트와 통합되는 교체 net standard 2.0 라이브러리를 테스트하는 데 문제가 있었습니다.생태계 내의 몇 가지 다른 프로젝트들도 이 대체 라이브러리에 의존했습니다.

시스템에서 새로운 라이브러리를 테스트할 때,MissingMethodException발생했습니다.

제 경우에는 새 라이브러리에서 기본 클래스의 추상화 방식을 변경했지만 새 라이브러리에 의존하는 프로젝트를 재구축하지는 않았습니다.

이로 인해 메서드의 예상 추상적 구현이 런타임에 누락되었을 수 있습니다.

를 통해 모든 종속성이 재구축되고 있음을 확인할 수 있습니다.

이것이 아주 오래된 질문이라는 것을 알지만 아마도 이것이 누군가에게 도움이 될 것입니다.

저도 똑같은 문제가 있었습니다.문제를 해결하는 것은 실제로 최근에 웹 서버에서 게시한 모든 프로젝트 파일을 삭제하고 프로젝트를 정리 및 재구성하여 다시 게시하는 것이었습니다.

그 후 '파일이 미리 컴파일되지 않아 요청할 수 없습니다'라는 예외가 발생했습니다.알고 보니 조립품이 없어졌습니다.

오류 메시지는 분명 오해의 소지가 있고 그 문제를 해결하는 데 3일이 걸렸습니다.

저처럼 꼼짝 못하게 된 사람을 도와드리고 싶은 마음에 답을 올립니다.
다음 오류가 발생했습니다.

Method not found: 'Microsoft.Scripting.Hosting.ScriptEngine IronPython.Hosting.Python.CreateEngine()

다음을 포함하여 제안된 해결책에 대해 시도했습니다(이에 국한되지는 않음).gacutil.exe /u IronPython개발자 콘솔 광고 관리자이지만 다음과 같은 것 외에는 아무 것도 제게 효과가 없었습니다.

1- C로 이동:\Windows\Microsoft.NET\
2 - "Iron Python" 검색
3- 찾은 폴더를 모두 삭제합니다. 내 경우:
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\IronPython
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\IronPython.stdlib

제 경우에는 Nuget 패키지의 버전 번호를 업데이트하지 않고 수동으로 업데이트했습니다.버전 번호가 업데이트되지 않았기 때문에 패키지를 완전히 다시 설치해도 로컬 캐시에서 패키지가 로드되었습니다.Nuget 패키지의 버전 번호를 늘리면 방법을 찾을 수 있습니다.

이거 저도 먹었어요.결국 프로젝트가 하나의 디렉토리에서 솔루션으로 참조되었지만 이전 버전인 csproj 파일에 있었습니다.결과적으로 컴파일은 가능했지만 게시된 파일은 이전의 잘못된 파일이었습니다.

언급URL : https://stackoverflow.com/questions/7578583/method-not-found-on-runtime