Pregunta

Tengo un ASP.NET aplicación que se ejecuta en un servidor web remoto y acabo de empezar a conseguir este error:

Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'.

He desmontado el código de la DLL y parece que el compilador es incorrecto optimizar el código.(Tenga en cuenta que es una clase que implementa un conjunto de objetos únicos.Se hereda de IEnumerable.) Esta línea:

Set<int> set = new Set<int>();

Se compila en esta línea:

Set<int> set = (Set<int>) new ICollection<CalendarModule>();

El CalendarModule clase es completamente independiente de la clase!!¿Alguien ha notado .NET incorrectamente la compilación de código como esto antes?

Actualización #1: Este problema parece ser introducido por Microsoft ILMerge de la herramienta.Actualmente estamos investigando cómo superarlo.

Actualización #2: Hemos encontrado dos formas de solucionar este problema hasta ahora.No entendemos muy bien cuál es el problema de fondo es, pero ambos de estos solucionarlo:

  1. Desactivar la optimización.

  2. Combinar el assemblie con ILMerge en una máquina diferente.

Así que se preguntan si la construcción de la máquina está configurado de alguna manera (lo cual es extraño teniendo en cuenta que hemos estado utilizando la máquina para construir versiones para más de un año) o si es algún otro problema.

¿Fue útil?

Solución

Ahh, ILMerge - que la información adicional en su pregunta, en realidad, le ayuda con su problema.Mientras no me espera siempre el .net compilador producirá un error en esta manera me iba a esperar a que de vez en cuando veo este tipo de cosas con ILMerge (dado lo que está haciendo).

Mi conjetura es que dos de sus asambleas son el uso de la misma optimización 'truco', y una vez fusionados obtener el conflicto.

Ha planteado el error con Microsoft?

Una solución en el ínterin es volver a compilar las asambleas de la fuente como un único conjunto, el ahorro de la necesidad de ILMerge.Como el csproj archivos son sólo listas XML básicamente son fáciles de combinar, y podría automatizar que como un extra de MSBuild paso.

Otros consejos

¿Estás seguro de que la asamblea usted está buscando en realidad fue generado a partir del código fuente en cuestión?Son capaces de reproducir este problema con una pequeña prueba?

Editar: si usted está utilizando el Reflector, es posible que el código MSIL a C# conversión no es la correcta-Reflector no siempre es 100% exacta en la descompilación.¿Qué hace el MSIL parece?

Edit 2: Hmm...Me acabo de dar cuenta que no se puede Reflector de la culpa o no habría conseguido que el mensaje de error en tiempo de ejecución.

Esto es más probable que sea un problema con la herramienta de reflexión que con el .Red de compilación.El error que estás recibiendo - un constructor no se encontró durante remoting es más probable que sea una seriación problema (todos los serialisable clases necesitan un constructor sin parámetros).

El código que se encuentra desde su herramienta de reflexión es más probable que lanzar una conversión de tipo de excepción.

Estoy de acuerdo con ambos Curt y Camas;esto suena como que algo está seriamente mal.El optimizador ha trabajado para todos nosotros y no hay tales errores han sido reportados (que yo sepa) - podría ser que usted está, de hecho, haciendo algo mal?

Nota al margen:También me gustaría señalar System.Collections.Generic.HashSet<T> que es en .Net fx 3.5 y hace exactamente lo que una Set<> la clase debe.

Era el código recientemente implementado en el servidor?Podría alguien haber empujado a construir sin su conocimiento?Puede usted ir a la fuente de control, tire de la última, y duplicar el problema?

En este punto, con la información dada, me cabe duda de que es el compilador.

Ouch.Si esto realmente es ILMerge la culpa, por favor, mantenga este tema hasta la fecha con sus conclusiones, yo uso ILMerge como un paso clave en la construcción de un ensamblado de interoperabilidad COM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top