System.MissingMethodException: метод не найден?

245

То, что когда-то работало в моем приложении asp.net, теперь выдает эту ошибку:

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()
    {
    //
    }
}
user603007
источник
Можете ли вы опубликовать еще немного кода, потому что этот код недействителен.
Мироныч
2
Что такое somepage? Как отмечается в «звуке», этот код недействителен. Пожалуйста, дайте нам полный фрагмент кода, который демонстрирует проблему.
Эми

Ответы:

389

Это проблема, которая может возникнуть, если где-то еще существует старая версия DLL. Убедитесь, что самые последние сборки развернуты, и в некоторых папках нет дублированных старых сборок. Лучше всего будет удалить все построенные элементы и перестроить / заново развернуть все решение.

государственное устройство
источник
62
В частности, убедитесь, что старой версии нет в GAC.
ladenedge
7
Кроме того, если вы работаете в неудачном случае, когда у вас есть библиотека, которая зависит от библиотеки, которая зависит от библиотеки и т. Д. Затем убедитесь, что очистили / перестроили все зависимые библиотеки с одинаковой версией какой-либо DLL, NHibernate в моем случае ...
Серж Саган
2
Обновление целевой платформы .NET для проекта также может исправить ошибку. Я обновлял проект MVC4 / Web API 1 для .NET 4.5. После обновления всех зависимостей MVC, Web API и Entity Framework я столкнулся с той же ошибкой; изменение целевой платформы на .NET 4.5.1 позволило устранить ошибку.
Сергей К
1
Это случилось со мной, когда я развернул только измененный exe-файл и не развернул вспомогательный dll, потому что в нем не было никаких изменений кода - но он был перестроен. Я развернул эту восстановленную DLL и ошибка ушла. Я сделал другие развертывания без повторного развертывания остальной неизменной DLL и не было никаких проблем, поэтому я до сих пор не уверен, что именно здесь произошло. Я предполагаю, что безопаснее всего развернуть любой восстановленный файл независимо от того, есть ли в нем изменения кода или нет.
Хо Хо Хо
15
Я нашел полезным открыть окно «Отладка -> Windows -> Модули» при отладке, чтобы увидеть, откуда загружается сборка.
JamesD
32

⚠️ Неверная версия пакета Nuget ⚠️

У меня был блок тестового проекта , который тянул в нашей компании внутреннего пакета доступа к данным EF NuGet и что код тянут в внешнем пакете , чей вариант был путем позади текущей версии.

Проблема заключалась в том, что настройки Nuget для пакета были установлены на least version; и старая версия победила и использовалась во время операций ....

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


💡 решение 💡

Установив / обновив пакет в Nuget для использования и [получения] самой последней , исправили проблему.

ΩmegaMan
источник
1
Это исправило это для меня. Управление пакетами для решения не работало, но мне приходилось обновлять каждый проект в отдельности.
aoakeson
Мой проект модульного тестирования ссылался на новую версию,
отличную
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), она указывает версию .NET Framework, на которую ориентировано приложение. docs.microsoft.com/en-us/dotnet/framework/configure-apps/...
bgcode
21

Перезапуск Visual Studio фактически исправил это для меня. Я думаю, что это было вызвано старыми файлами сборки, которые все еще используются, и выполнение «Чистой сборки» или перезапуск VS должно исправить это.

Джелани
источник
5

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

Джош Но
источник
5

Я только столкнулся с этим на .NET MVC проекте. Основной причиной были конфликтующие версии пакетов NuGet. У меня было решение с несколькими проектами. Каждый из проектов имел несколько пакетов NuGet. В одном проекте у меня была версия пакета семантической регистрации Enterprise Library, а в двух других проектах (которые ссылаются на первый) у меня были более старые версии того же пакета. Все это компилируется без ошибок, но при попытке использования пакета выдает загадочную ошибку «Метод не найден».

Исправление состояло в том, чтобы удалить старые пакеты NuGet из двух проектов, чтобы он был включен только в один проект, который действительно нуждался в нем. (Также я сделал чистую перестройку всего решения.)

Марк Мейер
источник
5

Проверьте ваши рекомендации!

Убедитесь, что вы постоянно указываете на одни и те же сторонние библиотеки (не просто доверяйте версиям, посмотрите на путь) в своих проектах решений.

Например, если вы используете iTextSharp v.1.00.101 в одном проекте и используете NuGet или ссылаетесь на iTextSharp v1.00.102 где-то еще, вы получите такие типы ошибок времени выполнения, которые каким-то образом просочатся в ваш код.

Я изменил свою ссылку на iTextSharp во всех 3 проектах, чтобы указать на одну и ту же DLL, и все работало.

Juls
источник
Для меня это было хорошо, чтобы очистить проект и удалить и добавить некоторые ссылки еще раз.
Хонза П.
Это особенно проблема с VS 2017, потому что он часто предлагает вам добавить ссылку, которая задает исходный путь к выходной папке другого проекта в решении, а не к выходной папке ссылочной сборки.
г-н Т.А.
4

Если вы разрабатываете на своем собственном сервере NuGet, убедитесь, что версии сборок одинаковы:

[assembly: AssemblyVersion("0.2.6")]
[assembly: AssemblyFileVersion("0.2.6")]
[assembly: AssemblyInformationalVersion("0.2.6")]
Сеннетт
источник
Как мне это проверить?
SerG
Я думаю, что в нупкг.
Сеннет
4

также .. попробуйте "очистить" свои проекты или решение и восстановить заново!

user384080
источник
3

Вы пытались выключить и снова включить? Шутки в сторону, перезагрузка моего компьютера была тем, что действительно помогло мне и не упоминается ни в одном из других ответов.

Ли Бейли
источник
3

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

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

Джейми Луптон
источник
2

В моем случае это была проблема копирования / вставки. Я каким-то образом закончил с конструктором PRIVATE для моего профиля отображения:

using AutoMapper;

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

(обратите внимание на отсутствующую «публика» перед ctor)

который компилируется отлично, но когда AutoMapper пытается создать экземпляр профиля, он не может (конечно!) найти конструктор!

DaBeSoft
источник
@RenaudGauthier возможно я что-то неправильно прочитал в ответе Джона Скитса, но он заявляет, что классы без модификатора доступа являются внутренними, и в комментариях он буквально заявляет: «Нет, это не так. Если вы объявляете конструктор и не указываете доступность, это будет быть приватным. См. раздел 10.3.5 спецификации C # ". Итак, я думаю, что мой конструктор является частным? Пожалуйста, поправьте меня, если я ошибаюсь. И да, мой ответ был вне контекста, я пришел сюда из другого Вопроса (который не дал мне ответа). Я тоже добавлю ссылку на мой ответ.
DaBeSoft
Вы абсолютно правы, не обращайте на меня внимания, я удалил бесполезный комментарий.
Рено Готье
1

У меня был похожий сценарий, когда я получал это исключение. В моем решении для веб-приложений было два проекта, названных, например, DAL и DAL.CustSpec. В проекте DAL был метод с именем Method1, а в DAL.CustSpec - нет. Мой основной проект имел ссылку на проект DAL, а также ссылку на другой проект с именем AnotherProj. Мой основной проект позвонил в Method1. Проект AnotherProj имел ссылку на проект DAL.CustSpec, а не проект DAL. В конфигурации сборки были настроены как проекты DAL, так и проекты DAL.CustSpec. После того, как все было построено, мой проект веб-приложения содержал сборки AnotherProj и DAL в своей папке Bin. Однако, когда я запустил веб-сайт, папка Temporary ASP.NET для веб-сайта имела сборку DAL.CustSpec в своих файлах, а не сборку DAL, по какой-то причине. Конечно, когда я запустил часть, которая называлась Method1, я получил ошибку «Метод не найден».

Чтобы исправить эту ошибку, мне нужно было изменить ссылку в проекте AnotherProj с DAL.CustSpec на DAL, удалить все файлы в папке Temporary ASP.NET Files, а затем повторно открыть веб-сайт. После этого все заработало. Я также удостоверился, что проект DAL.CustSpec не был собран, сняв флажок в Конфигурации сборки.

Я думал, что поделюсь этим, если это поможет кому-то еще в будущем.

Рон Канаги
источник
1

Я столкнулся с такой же ситуацией на моем сайте ASP.NET. Я удалил опубликованные файлы, перезапустил VS, почистил и заново собрал проект. После следующей публикации ошибка исчезла ...

Irshu
источник
1

Я решил эту проблему, сделав набор полок с моими изменениями и запустив TFS Power Tools «scorch» в моей рабочей области ( https://visualstudiogallery.msdn.microsoft.com/f017b10c-02b4-4d6d-9845-58a06545627f ). Затем я отменил изменения и перекомпилировал проект. Таким образом, вы очистите любые «зависания», которые могут присутствовать в вашем рабочем пространстве, и запустите новую. Это требует, конечно, что вы используете TFS.

fbastian
источник
1

Также возможно, что проблема связана с параметром или типом возврата метода, о котором сообщается, что он пропущен, и «отсутствующий» метод сам по себе вполне подойдет.

Это то, что происходило в моем случае, и вводящее в заблуждение сообщение заставило намного больше времени выяснить проблему. Оказывается, сборка для типа параметра имела более старую версию в GAC, но более старая версия фактически имела более высокий номер версии из-за изменения используемых схем нумерации версий. Удаление этой более старой / более поздней версии из GAC устранило проблему.

Джимми
источник
1

Использование Costura.Fody 1.6 & 2.0: Потратив
кучу времени на поиск этой же ошибки, когда все остальные потенциальные решения не работали, я обнаружил, что более старая версия DLL, которую я встраивал, была в той же директории, где я работал. вновь скомпилированный .exe из. Очевидно, он сначала ищет локальный файл в том же каталоге, а затем смотрит внутрь своей встроенной библиотеки. Удаление старой DLL сработало.

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

grep65535
источник
1

В моем случае это была папка с более ранними DLL-библиотеками с тем же именем, на которые ссылались в моем файле .csproj, хотя путь был явно задан, поскольку они были каким-то образом включены, поэтому несколько версий одних и тех же DLL находились в конфликте.

Александр Добрикур
источник
1

В моем случае MissingMethodException был для метода, который был в том же файле!

Однако я только что добавил пакет NuGet, который использует .Net Standard2, в мой проект нацеливания на 4.7.1, что вызвало конфликт версий для System.Net.Http (4.7.1: версия 4.0.0.0, пакет NuGet с использованием .NET Стандарт 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 только при вызове локальной функции, которая использует System.Net.Http.HttpResponseMessage в качестве параметра или типа возврата (параметр во время отладки, тип возврата при запуске тесты без отладчика тоже немного странные). И вместо того, чтобы показать сообщение о том, что он не может загрузить версию System.Net.Http 4.2.0.0, он возвращает это исключение.

Леголас
источник
0

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

Я сделал чистку и восстановил и отметил, что это пропускало два проекта. Когда я перестроил один из них, произошла ошибка, когда я запустил функцию, а не завершил ее.

Поэтому VS ссылался на модель, которую я переписал, не спрашивая меня, хочу ли я это сделать.

TheWizardOfTN
источник
0

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

У меня была эта ошибка при использовании Jenkins.

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

Ренато Ченчински
источник
0

Я столкнулся с этой проблемой, и для меня это был один проект, использующий List, который находился в пространстве имен Example.Sensors, а другой тип реализовал интерфейс 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 в проводнике процессов, а затем перекомпилировал.

bytedev
источник
0

У меня был тестовый проект, который ссылается на 2 других проекта, каждый из которых ссылался на разные версии (в разных местах) одной и той же DLL. Это смутило компилятор.

nuander
источник
0

В моем случае spotify.exe использовал тот же порт, который мой проект web api хотел использовать на компьютере разработчика. Номер порта был 4381.

Я вышел из Spotify и все снова заработало :)

Арда Басоглу
источник
0

У меня была эта проблема, когда метод требовал параметр, который я не указывал

Лорд дарт вейдер
источник
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 - мы автоматизировали утилизацию AppPool каждый день в 3 часа ночи, и проблема началась в 3 часа ночи, а затем закончилась сама по себе в 3 часа ночи на следующий день.

Джордж
источник
0

Должно быть справочной ошибкой от Microsoft.

Я почистил, пересобрал все мои библиотеки и все еще получил ту же проблему и не смог решить эту проблему.

Я только закрыл приложение Visual Studio и снова открыл его. Это добилось цели.

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

ДжейДжей Барнард
источник
0

В моем случае мой проект ссылался Microsoft.Net.Compilers.2.10.0. Когда я переключил его на Microsoft.Net.Compilers.2.7.0, ошибка исчезла. Какая загадочная ошибка с таким разнообразием причин.

jaycer
источник