System.MissingMethodException после добавления необязательного параметра - PullRequest
24 голосов
/ 27 марта 2012

Я получаю ошибку System.MissingMethodException после того, как у меня есть необязательный параметр в одном компоненте, а другой компонент, который вызывает его, не был собран, поскольку он вызывает его со старым числом параметров.

Только компонент, в которомДобавлен параметр был построен развернут как патч.Вызывающий компонент устарел, поскольку в нем нет изменений.

При запуске вызывающего компонента выдается ошибка:

Информация об исключении

Тип исключения: система.Сообщение MissingMethodException: метод не найден: 'LabelURLs IPSD.BnB.Transaction.Postage.GetLabelURLs (System.String)'.Данные: System.Collections.ListDictionaryInternal TargetSite: Void GenerateScanForm (Int32, Int32) HelpLink: NULL Источник: BnBDispenseQueueProcess

Насколько я знаю, он не должен вызывать ошибку, поскольку новый параметр не является обязательным.Еще одна вещь, вызывающая компонент (EXE), запускается как служба Windows.

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

Я думаю, что мне не хватает некоторых внутренних компонентов .net.

Дайте мне знать, если потребуется дополнительная информация.

1 Ответ

42 голосов
/ 27 марта 2012

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

Там должно быть изменением, потому что старый код вызывает метод, которого больше не существует!

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

Это не решение во время выполнения - это решение во время компиляции . Если у вас есть такой метод:

void Foo(int x, int y = 5)

и вы называете это так:

Foo(10);

тогда компилятор эффективно преобразует это в вызов:

Foo(10, 5);

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

void Foo(int x)
{
    Foo(x, 5);
}

void Foo(int x, int y)
{
    ...
}

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

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

...