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

System.MissingMethodException после добавления необязательного параметра

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

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

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

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

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

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

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

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

Сообщите мне, нужна ли дополнительная информация.

4b9b3361

Ответ 1

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

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

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

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

void Foo(int x, int y = 5)

и вы вызываете это следующим образом:

Foo(10);

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

Foo(10, 5);

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

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

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

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

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