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

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

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

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

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

Тип исключения: System.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.

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

 sandeep26 февр. 2015 г., 13:17
@CreativeManix спасибо за обмен информацией :)
 CreativeManix20 февр. 2015 г., 13:29
@Sanddep, как отметил Джон Скит, необязательные параметры - это функция времени компиляции. Во время компиляции в сборке Caller дополнительные значения параметров передаются со значениями по умолчанию. поэтому, если вы добавили необязательный параметр в общую библиотеку, убедитесь, что вы также компилируете сборку вызывающей стороны. Если вы не хотите компилировать все сборки вызывающего, лучше не использовать необязательный параметр, вместо этого используйте перегруженный метод;
 CreativeManix04 февр. 2015 г., 18:00
Мы добавили необязательный параметр в одну из нашей общей библиотеки. Это сломало все работающие модули (Нам повезло, это было на тестировании env). Это причудливые функции времени разработки .net, похоже, мы должны глубоко понять их, прежде чем использовать его. Спасибо за вопрос.
 sandeep19 февр. 2015 г., 12:06
@CreativeManix, пожалуйста, дайте мне знать, что вы нашли. так как не смог полностью понять, почему он так себя вел. может быть какой-то трюк компиляции происходит за сценой

Ответы на вопрос(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 на место, вы заменили ее нановый версия (с необязательным параметром), а не старая версия?

 Jon Skeet27 мар. 2012 г., 11:10
@sandeep: Да, это будет иметь огромное значение. Это не объясняет обходной путь, но делает все остальное несколько неуместным. Выдействительно нужно думать о такой важной информации, когда задаешь вопрос. Пожалуйста, опубликуйте код, который вы используете для вызова метода.
 Jon Skeet27 мар. 2012 г., 09:44
@sandeep: Извините, я не понимаю, что означает ваш предыдущий комментарий.
 Jon Skeet27 мар. 2012 г., 09:09
@sandeep: ясильно Подозреваю, что в вашем диагнозе есть обходной путь, который неверен. Сколько раз вы пробовали это? Вы определенно видели это, используя новый код? Вы определенноне заменил код вызова? Это просто не должно работать - там ничего нетделать это в C #, если вы не используете динамическую типизацию.
 sandeep27 мар. 2012 г., 09:42
одно обновление, связанное с заменой DLL.
 sandeep27 мар. 2012 г., 09:07
да я заменяю только на новую версию. Ваш ответ имеет смысл. Но из-за обходного пути это доза не выглядит полностью верным в моем случае.

Ваш ответ на вопрос