19

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

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

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

Exception Информация

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

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

+0

Мы добавили необязательный параметр в одну из наших общих библиотек. Это сломало все запущенные модули (нам повезло, это было на тестировании env). Это модные особенности времени разработки .net, похоже, мы должны глубоко их понять, прежде чем использовать его. Спасибо, что спросили об этом. – CreativeManix

+0

@CreativeManix, пожалуйста, дайте мне знать, что вы нашли. так как он не мог полностью понять, почему он так себя вел. может быть какой-то компиляционный трюк, происходящий за сценой – sandeep

+0

@Sanddep, как упоминал Джон Скит, необязательные параметры - это функция времени компиляции. В момент компиляции в сборке Caller дополнительные значения параметров передаются со значениями по умолчанию. поэтому, если вы добавили необязательный параметр в общую библиотеку, убедитесь, что вы также собираете сборку вызовов. Если вы не хотите компилировать всю сборку вызовов лучше использовать необязательный параметр, вместо этого используйте перегруженный метод; – CreativeManix

ответ

31

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

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

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

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

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

+0

да я заменяю только новой версией. Ваш ответ имеет смысл. Но из-за обходного пути его доза не выглядит полностью правдой в моем случае. – sandeep

+0

@sandeep: Я * сильно * подозреваю, что есть что-то о вашем диагнозе обходного пути, который неверен. Сколько раз вы это пробовали? Вы определенно видели это, используя новый код? Вы определенно * не * заменили код вызова? Это просто не должно работать - в C# нет ничего, чтобы сделать это *, если вы не используете динамическую типизацию. –

+0

одно обновление, связанное с заменой DLL. – sandeep

 Смежные вопросы

  • Нет связанных вопросов^_^