Подтвердить что ты не робот

Исключение С# "Метод не найден" во время выполнения без использования отражения

У меня проблема с получением исключения. У меня относительно простая структура, отдельная в двух dll.

Первый содержит IEntityService, IEntity, с базовой реализацией. Второй содержит фактические реализации, а также интерфейсы. поэтому есть служба IMachine, которая реализует IEntityService и MachineService, которая реализует как IEntityService, так и EntityService. Аналогичная ситуация наблюдается для коллекции результатов (entity plus service). Кроме того, служба (машина и результат) являются частичными классами/интерфейсами, где один из классов автогенерируется.

Теперь в одном из ResultMachine я пытаюсь получить машину, и в случае, если она не существует, я создаю ее и сохраняю. Однако, когда я пытаюсь сохранить, я получил "Метод не найден" при попытке получить доступ к методу сохранения из класса EntityService. Однако, если я завершаю метод EntityService.Save в MachineService, он работает без каких-либо исключений.

Отредактировано:

Код не требуется. Резолюция заключалась в том, чтобы повторно связать ссылку. Что вводило меня в заблуждение, что моя dll не находится в GAC, это связано с VS. Более того, он не сильно подписан, единственная разница - номер версии.

4b9b3361

Ответ 1

Моим первым инстинктом было бы проверить, чтобы сборки содержали классы с отсутствующим методом. Я полагаю, что возможно, что сборка не сразу обновилась?

Ответ 2

У нас есть эта ошибка несколько раз, вы можете воссоздать проблему следующим образом:

  • Создан проект с 2 dll (скажем, DLL программы и тестовая dll)
  • развернуть программу dll в GAC
  • Добавить новый метод
  • Создать тест для тестирования нового метода
  • построить решение
  • запустить тест (не в режиме отладки)

Теперь вы получите исключение метода. Причина в том, что он использует старую версию dll, которая находится в GAC и не имеет метода.

Несколько раз он использует кэшированную версию старой DLL, IISreset может помочь.

В вашем случае проверьте все старые версии dll.

Ответ 3

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

Подробнее см. в этой статье: Контексты Fusion Loader - Невозможно использовать объект типа "Что бы ни было" для ввода "Ничего"

Ответ 4

Это случилось со мной, когда я вошел и изменил настройки сборки для вывода в /bin/Debug, а не просто /bin в случае, когда я также использовал IIS для размещения сайта из папки dev.

Вам необходимо иметь двоичные файлы в той же папке, что и служба, в моем случае, и изменить старые версии в папке bin и поместить последующие сборки в папку /bin/Debug (и/bin/Release).

Либо сохранить настройки как есть, либо выполнить пост-сборку, чтобы скопировать бит на один уровень, иметь разные приложения IIS для отладки/выпуска или полностью установить в другую папку. Последний, вероятно, наиболее "правильный", но для моих целей я понял, что после многократного вращения, у меня были разные версии в служебной папке. НТН.

Ответ 5

В моем случае я только что развернулся на машине с .NET 3.0 (Windows XP), а целью компиляции был .NET 3.5.

Это сообщение об ошибке действительно не помогает.

Проблема заключается в использовании DataContract из System.Runtime.Serialisation.