name method documentacion comentarios c# .net vb.net-2010 optional-parameters missingmethodexception

method - param name c#



System.MissingMethodException después de agregar un parámetro opcional (1)

Recibo el error de la excepción System.MissingMethodException después de tener un parámetro opcional en un componente y el otro componente que lo llamó no se generó como lo hace con el número de parámetros anterior.

Solo el componente en el que se agrega el parámetro fue construido y implementado como parche. El componente de llamada es antiguo ya que no hay cambios en él.

Cuando el componente que llama se ejecuta, da error:

Información de excepción

Tipo de excepción: System.MissingMethodException Mensaje: Método no encontrado: ''LabelURLs IPSD.BnB.Transaction.Postage.GetLabelURLs (System.String)''. Datos: System.Collections.ListDictionaryInternal TargetSite: Void GenerateScanForm (Int32, Int32) HelpLink: NULL Origen: BnBDispenseQueueProcess

Por lo que sé, no debería generar un error, ya que el nuevo parámetro es opcional. Una cosa más que llama al componente (EXE) se ejecuta como servicio de Windows.

Encontramos una solución muy cableada para hacerla funcionar. Al eliminar el componente modificado una vez y ejecutar el componente de llamada que dirá que no se encontró DLL. El lugar de nuevo el mismo DLL y el componente de llamada funciona bien :).

Creo que me faltan algunos internos de .net.

Déjame saber si se necesita más información.


Solo el componente en el que se agrega el parámetro fue construido y implementado como parche. El componente de llamada es antiguo ya que no hay cambios en él.

¡ Debería haber un cambio en él, porque el código antiguo llama a un método que ya no existe!

Por lo que sé, no debería generar un error, ya que el nuevo parámetro es opcional.

Esa no es una decisión de tiempo de ejecución, es una decisión de tiempo de compilación . Si tienes un método como este:

void Foo(int x, int y = 5)

y lo llamas así:

Foo(10);

entonces el compilador efectivamente convierte eso en una llamada de:

Foo(10, 5);

La llamada tiene la lista completa de argumentos en el binario. Si desea pasar de la versión de un solo parámetro a la versión de múltiples parámetros de una manera que no afecte a la compatibilidad binaria, tendría que agregar una sobrecarga, por ejemplo

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

Alternativamente, puede reconstruir el código de llamada y redistribuirlo también.

Soy profundamente sospechoso de su solución. ¿Está seguro de que cuando volvió a colocar la DLL en lugar de reemplazarla con la nueva versión (con el parámetro opcional) en lugar de la versión anterior?