我偶然发现了一些奇怪的东西:我得到了一个BadImageFormatException,而不知道它可能会引用什么图像(程序集)。
我简化了解决方案,使其仅由一个没有依赖关系的项目组成:

正如您所看到的,它只使用System (和mscorlib),当然我不会在运行时加载程序集。
它编译为带有AnyCpu的.NET 4.5.2,与使用C#6的2015编译,尽管这一切都不重要。
我试着用C#5制作一个样本,但是一旦我替换了所有的“?”操作员,一切都停止了。
我主持了这个项目,这样人们就可以自己尝试了:
git clone -b crash-sample https://github.com/jtheisen/moldinium.git我在4台机器上进行了清洁和测试,都显示出同样的效果.
崩溃的堆栈跟踪是:
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...在输出上运行PEVerify会产生以下错误:
错误: C:\Source\Repos\moldinium\ConsoleApplication1\bin\Debug\Bad.exe : IronStone.Moldinium.LiveList+<>c__DisplayClass10_0`1[TSource]::b__2无法解析令牌。
从?.文件中删除所有Select.cs运算符解决了这个问题。
使用ILSpy,我将问题隔离为:
IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2您可以在gist 这里中看到方法的IL转储(通过这里)。不好的IL是在使用?.时,好的IL是C# 5.0风格。
这是用has 2015.3构建的。
CSC版本: Microsoft (R) Visual C#编译器版本1.3.1.60616
发布于 2016-07-13 10:26:56
我帮不了你,因为它确实是个虫子。但是,我可以带您到bug发生的地方,它可能会帮助您在几行代码中再现bug。
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;
});
}
}
}如果我将MyGenericStruct<T>?替换为MyGenericStruct<int>?,它就会工作。
问题是,由于某种原因,当我们在可空结构中使用外部T,然后尝试使用Elvis运算符?时,类型是未知的(无法解析令牌)。
Update如果您想要修复您的情况,您不需要删除所有Elvis操作符,只需从public static ILiveList<TSource> Where<TSource>(this ILiveList<TSource> source, Func<TSource, Boolean> predicate)方法中的Subscribe操作中删除它们。
https://stackoverflow.com/questions/38316552
复制相似问题