C#编译器错误地优化代码

Kev*_*cht 3 c# asp.net compiler-construction optimization ilmerge

我有一个在远程Web服务器上运行的ASP.NET应用程序,我刚刚开始收到此错误:

Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'.
Run Code Online (Sandbox Code Playgroud)

我反汇编了DLL中的代码,似乎编译器错误地优化了代码.(注意,Set是一个实现一组唯一对象的类.它继承自IEnumerable.)这一行:

Set<int> set = new Set<int>();
Run Code Online (Sandbox Code Playgroud)

编译成这一行:

Set<int> set = (Set<int>) new ICollection<CalendarModule>();
Run Code Online (Sandbox Code Playgroud)

CalendarModule类是一个完全不相关的类!有没有人注意到.NET之前错误地编译代码?

更新#1:此问题似乎是由Microsoft的ILMerge工具引入的.我们目前正在调查如何克服它.

更新#2:到目前为止,我们找到了两种解决此问题的方法.我们不太明白底层问题是什么,但这两个问题都解决了这个问题:

  1. 关闭优化.

  2. 在不同的计算机上将集合与ILMerge合并.

因此,我们想知道构建机器是否以某种方式配置错误(考虑到我们已经使用机器来构建版本超过一年,这很奇怪)或者是否是其他问题.

Kei*_*ith 7

啊,ILMerge - 您问题中的额外信息确实有助于解决您的问题.虽然我不希望.net编译器以这种方式失败,但我希望偶尔会看到ILMerge的这种事情(鉴于它正在做什么).

我的猜测是你的两个程序集使用相同的优化'技巧',一旦合并你就会得到冲突.

你有没有提出微软的错误?

同时解决方法是将源程序集作为单个程序集重新编译,从而节省了对ILMerge的需求.由于csproj文件只是XML列表,因此它们基本上很容易合并,您可以将其自动化为额外的MSBuild步骤.