首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器错误时使用?导致PEVerify失败的不良图像

编译器错误时使用?导致PEVerify失败的不良图像
EN

Stack Overflow用户
提问于 2016-07-11 21:31:32
回答 1查看 309关注 0票数 16

我偶然发现了一些奇怪的东西:我得到了一个BadImageFormatException,而不知道它可能会引用什么图像(程序集)。

我简化了解决方案,使其仅由一个没有依赖关系的项目组成:

正如您所看到的,它只使用System (和mscorlib),当然我不会在运行时加载程序集。

它编译为带有AnyCpu的.NET 4.5.2,与使用C#6的2015编译,尽管这一切都不重要。

我试着用C#5制作一个样本,但是一旦我替换了所有的“?”操作员,一切都停止了。

我主持了这个项目,这样人们就可以自己尝试了:

代码语言:javascript
复制
git clone -b crash-sample https://github.com/jtheisen/moldinium.git

我在4台机器上进行了清洁和测试,都显示出同样的效果.

崩溃的堆栈跟踪是:

代码语言:javascript
复制
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,我将问题隔离为:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2016-07-13 10:26:56

我帮不了你,因为它确实是个虫子。但是,我可以带您到bug发生的地方,它可能会帮助您在几行代码中再现bug。

代码语言:javascript
复制
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操作中删除它们。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38316552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档