c# - Error del compilador al usar?. dando como resultado una mala imagen que falla PEVerify
visual-studio-2015 roslyn (1)
Me tropecé con algo extraño: obtuve una BadImageFormatException
sin saber a qué imagen (ensamblaje) podría referirse.
Reduje la solución para que solo consistiera en un solo proyecto sin dependencias:
Como puede ver, solo usa System
(y mscorlib
), y por supuesto no cargo los ensamblajes en tiempo de ejecución.
Compila como AnyCpu con .NET 4.5.2, VS 2015 con C # 6, aunque nada de esto debería importar.
Intenté hacer una muestra con C # 5, pero una vez que reemplacé todos los "?." Operadores, deja de suceder.
He alojado el proyecto para que las personas puedan probarlo ellos mismos:
git clone -b crash-sample https://github.com/jtheisen/moldinium.git
Lo construí y lo probé en 4 máquinas, todas con el mismo efecto.
El rastro de pila de la caída es:
Ex.: System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2(ListEvent`1 v)
at IronStone.Moldinium.ActionObserver`1.OnNext(T value) in C:/Source/Repos/moldinium/ConsoleApplication1/Rx.cs:line 51
...snipped...
La ejecución de PEVerify en la salida produce el siguiente error:
[IL]: Error: [C: / Source / Repos / moldinium / ConsoleApplication1 / bin / Debug / Bad.exe: IronStone.Moldinium.LiveList + <> c__DisplayClass10_0`1 [TSource] :: b__2] [offset 0x0000013B] No se puede resolver simbólico.
Eliminando todos los ?.
Los operadores del archivo Select.cs resuelven el problema.
Usando ILSpy he aislado el problema para:
IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2
Puede ver los volcados de IL del método (a través de ILSpy) here en un resumen. Lo malo es cuando se usa ?.
la Buena IL es estilo C # 5.0
Esto ha sido construido con VS2015.3
CSC Version: Microsoft (R) Visual C # Compiler versión 1.3.1.60616
No puedo ayudarte porque de hecho es un error. Pero puedo llevarlo al punto donde ocurre el error y puede ayudarlo a reproducir el error en unas pocas líneas de código.
namespace ElvisBugInNullableGenericStructWithNestedTypeParameter
{
struct MyGenericStruct<T> { }
class Program
{
static void Main() { }
void Test<T>()
{
Func<T, bool> func = (arg =>
{
MyGenericStruct<T>? v1 = null;
return v1?.ToString() == null;
});
}
}
}
¿Si reemplazaré MyGenericStruct<T>?
con MyGenericStruct<int>?
funcionará.
El problema es que, por alguna razón, ¿cuando usamos la T
externa en una estructura que admite nulos y luego intentamos usar el operador de Elvis ?
el tipo es desconocido (no se puede resolver el token).
Actualizar Si desea arreglar su caso, no necesita eliminar todos los operadores de Elvis, simplemente elimínelos de la acción Subscribe
dentro de la lista public static ILiveList<TSource> Where<TSource>(this ILiveList<TSource> source, Func<TSource, Boolean> predicate)
método.