19

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

El único componente en el que se agrega el parámetro fue compilar y desplegar como parche. El componente de llamada es antiguo ya que no hay cambios en él.

Cuando el componente llamando plazo que da el error:

Información excepcional

Excepción Tipo: System.MissingMethodException mensaje: método no encontrados: 'LabelURLs IPSD.BnB.Transaction.Postage.GetLabelURLs (System.String) '. Datos: System.Collections.ListDictionaryInternal TargetSite: Vacío GenerateScanForm (Int32, Int32) HelpLink: Fuente NULL: BnBDispenseQueueProcess

Por lo que yo sé que no debería plantear un error como nuevo parámetro es opcional. Un componente de llamada más (EXE) se ejecuta como servicio de Windows.

encontramos una solución muy alámbrica para que funcione. Al eliminar el componente modificado una vez y ejecutar el componente de llamada que dirá DLL no encontrado. El lugar donde está el DLL y el componente de llamada funcionan bien :).

Creo que me faltan algunas partes internas de .net.

Avisarme si necesita más información.

+0

Agregamos el parámetro opcional a una de nuestra biblioteca común. Eso rompió todos los módulos en ejecución (Tenemos suerte, fue en pruebas env). Estas son características de tiempo de desarrollo de .net, parece que tenemos que entenderlas profundamente antes de usarlo. Gracias por preguntar esto. – CreativeManix

+0

@CreativeManix por favor hágamelo saber su hallazgo. como no fue capaz de entender completamente por qué se comportó así. puede ser un truco de compilación que ocurre detrás de la escena – sandeep

+0

@Sanddep como mencionó Jon Skeet, los parámetros opcionales son función de tiempo de compilación. En el tiempo de compilación en el conjunto del llamador, los valores de param opcionales se pasan con los valores predeterminados. por lo tanto, si agregó un parámetro opcional a la biblioteca común, asegúrese de que también está compilando el conjunto de la persona que llama. Si no quiere compilar todo el conjunto de llamadas mejor, no use param opcional, use un método sobrecargado; – CreativeManix

Respuesta

31

El único componente en el que se agrega el parámetro fue compilar y desplegar como parche. El componente de llamada es antiguo ya que no hay cambios en él.

Hay debe haber un cambio en ella, porque el viejo código 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.

eso no es una toma de tiempo de ejecución - que es una decisiónen tiempo de compilación. Si usted tiene un método como este:

void Foo(int x, int y = 5) 

y se llama así:

Foo(10); 

entonces el compilador convierte efectivamente que en una llamada de:

Foo(10, 5); 

La llamada tiene la lista de argumentos completa en el binario. Si quiere 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 la compatibilidad binaria, debería agregar una sobrecarga en su lugar, p.

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

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

Como alternativa, puede reconstruir el código de llamada y volver a implementar eso también.

Tengo mucha sospecha de su solución. ¿Está seguro de que al volver a colocar el archivo DLL lo reemplazó con la nueva versión (con el parámetro opcional) en lugar de la versión anterior?

+0

sí, lo reemplazo solo por una nueva versión. Tu respuesta tiene sentido. Pero debido a la solución, la dosis no parece completamente cierta en mi caso. – sandeep

+0

@sandeep: I * fuertemente * sospecho que hay algo acerca de su diagnóstico de la solución que es incorrecto. ¿Cuántas veces has probado eso? ¿Lo has visto definitivamente usando el nuevo código? ¿Definitivamente * no * reemplazaste el código de llamada? Simplemente no debería funcionar; no hay nada en el lugar para * hacer * esto en C#, a menos que esté usando tipeo dinámico. –

+0

una actualización relacionada con la sustitución de DLL. – sandeep

Cuestiones relacionadas