Метод не найден во время выполнения - PullRequest
27 голосов
/ 28 сентября 2011

У меня есть проект ASP.Net c #, пытающийся получить доступ к методам в классе в другом проекте.Это работает для первой половины методов в классе, но не для другой половины методов в классе, который я недавно добавил.Они компилируются, но выдают метод not found исключение во время выполнения.

У кого-нибудь есть идеи, которые я мог бы попробовать?Я пробовал:

  1. воссоздание файла .sln
  2. Subbing в другом проекте библиотеки классов, который, как я знаю, работает.Похоже, что ошибка в моем основном проекте, который вызывает метод в другом проекте.

Ответы [ 19 ]

54 голосов
/ 28 сентября 2011

«Метод не найден» - это очень специфическая ошибка, которая означает, что метод, которого он ожидал (т.е. был там во время компиляции), просто отсутствует.Обычно это означает, что файлы, которые вы развертываете , отличаются от того, что вы думаете, в частности, я бы поспорил, что вы развертываете старую версию библиотеки (в которой отсутствуют ваши дополнения)).

Сверьте dll, развернутые на веб-сервере, с тем, что, по вашему мнению, должно быть.

13 голосов
/ 30 марта 2017

У меня была такая же проблема.В моем случае это было вызвано добавлением необязательного аргумента .Итак, сначала вы должны иметь:

referescingAssembly:

referencedAssembly.DoStuff(firstArgument, secondArgument)

referencedAssembly:

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

Тогдавы добавляете необязательный параметр к методу, но не предоставляете этот аргумент при его вызове.

referencingAssembly:

referencedAssembly.DoStuff(firstArgument, secondArgument)//unchanged

referencedAssembly:

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

Локально, это будет собираться и работать нормально, так как недавно построенная referencingAssembly.dll будет иметь ссылку на метод DoStuff (string, string, string).Но когда вы развертываете только измененную referencedAssembly (думая, что добавленный аргумент был необязательным, а referncingAssembly все еще работает), старая версия referencingAssembly выбрасывает MethodNotFound, так как он ищет метод с подписью DoStuff (string, string), которая являетсябольше не присутствует в referencedAssembly, поскольку мы добавили дополнительный (необязательный) аргумент.


Возможным решением может быть перегрузка:

referencedAssembly:

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
}

Или развертывание новой сборки referencingAssembly (которая будет ссылаться на метод с подписью DoStuff (string, string, string)).

10 голосов
/ 12 января 2015
У

была та же проблема, в моем случае, установка optimizeCompilations в false в webconfig решила проблему

7 голосов
/ 28 сентября 2011

Я столкнулся с такой проблемой, но смог ее решить.Я опустошил папку bin и debug и снова попытался собрать проект.это сработало, по крайней мере, для меня.Или попробуйте очистить решение и попытаться восстановить его.Но, конечно, размещение части вашего кода может быть более полезным.

4 голосов
/ 03 апреля 2013

У меня была очень похожая проблема, и я обнаружил, что более старая версия сборки была установлена ​​в GAC.После того, как я удалил эту версию, проект скомпилирован и запущен правильно.Поэтому проверьте GAC (C:\Windows\Assembly), чтобы убедиться, что его там нет.

4 голосов
/ 06 мая 2016

Я тоже столкнулся с тем же исключением, хотя моя проблема была в другом, в одной из моих библиотек был метод, который изначально выглядел так:

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

и появился новый запрос на изменение, и он превратился в это:

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

после этого я обновил проект, использующий эту библиотеку, с недавно скомпилированным двоичным файлом, он начал выдавать это исключение.

После многих попыток ничего не сработало, даже очистить проект, перестроить, удалить и повторно добавить ссылку, затем я попытался изменить вызов метода проекта из:

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

до:

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

и затем скомпилировал проект, он решил проблему, после чего я изменил его обратно на:

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

и теперь он волшебным образом исправил все, может быть, где-то остались какие-то кэшированные метаданные, которые не обновляются, и изменение способа вызова метода каким-то образом ясно напоминает ему, что сигнатура метода отличается, но не так отличается.

Надеюсь, это поможет кому-то, столкнувшемуся с той же проблемой, с которой я столкнулся.

3 голосов
/ 27 июня 2017

Два проекта в вашем решении: проект A и проект B. Оба проекта используют пакет nuget "DoStuff", но разные версии пакета DoStuff:

  • проект A ссылается на версию 1.1 DoStuff.
  • проект B ссылается на версию 1.0 DoStuff.
  • проект B ссылается на проект A.

версия 1.1 имеет новый метод, который используется в проекте A. когдаВ проекте B используется проект A, вы получите это MethodNotFoundException, поскольку версия DoStuff проекта B не знает, о чем идет речь в проекте A.

Чтобы предотвратить это, у нас есть модульный тест, который завершается неудачно, еслипроекты используют разные версии одного и того же пакета nuget.Относительно простой дверной проем, который спас нас от нескольких головных болей в последние годы.

2 голосов
/ 18 января 2013

Послушайте, это, должно быть, самая странная причина, но после целого утра, пробующего все, перестраивая проект с нуля и т. Д., Я заметил, что единственной вещью, которая могла бы избежать этой проблемы, было, если бы моя библиотека имела другое имя сборки ,

У меня было ужасное предположение, что я установил предыдущие версии dll в GAC, но я уже проверил это и, кроме того, это никогда не было моим намерением. Но, следуя по этому пути, я обнаружил, что эта dll (и все остальные из проекта!) Была установлена ​​в C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ IDE !!!!!!

Аааааа! Думаю, я единственный, кто как-то все испортил, но я понятия не имею, почему, я просто подумал, что смогу избавить кого-то еще от этого расстройства из-за того, что кому-то так не повезло !!

2 голосов
/ 12 мая 2016

Я столкнулся с той же проблемой, когда запускал приложение с dll, управляемым пакетом nuget. Оказывается, когда я пытаюсь обновить dll из диспетчера пакетов nuget, он не обновил мой тестовый слой. Я предлагаю вам проверить версию DLL, на которую вы ссылаетесь. Перейдите к ObjectBrower в VS и проверьте dll и проверьте местоположение ссылки: убедитесь, что вы ссылаетесь на последние dll.

1 голос
/ 02 июля 2013

Ошибка также произошла, когда у меня было Действие в качестве параметра.Я передал метод, не заключая его в новое действие (..).

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) );

исключение исчезло.Текст исключения просто вводит в заблуждение - метод есть, но тип параметра дал исключение времени выполнения.Жаль, что во время компиляции он не обнаружен.

...