我有一个在远程Web服务器上运行的ASP.NET应用程序,我刚刚开始收到此错误:
Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'.
我反汇编了DLL中的代码,似乎编译器错误地优化了代码.(注意,Set是一个实现一组唯一对象的类.它继承自IEnumerable.)这一行:
Setset = new Set ();
编译成这一行:
Setset = (Set ) new ICollection ();
CalendarModule类是一个完全不相关的类!有没有人注意到.NET之前错误地编译代码?
更新#1:此问题似乎是由Microsoft的ILMerge工具引入的.我们目前正在调查如何克服它.
更新#2:到目前为止,我们找到了两种解决此问题的方法.我们不太明白底层问题是什么,但这两个问题都解决了这个问题:
关闭优化.
在不同的计算机上将集合与ILMerge合并.
因此,我们想知道构建机器是否以某种方式配置错误(考虑到我们已经使用机器来构建版本超过一年,这很奇怪)或者是否是其他问题.
啊,ILMerge - 您问题中的额外信息确实有助于解决您的问题.虽然我不希望.net编译器以这种方式失败,但我希望偶尔会看到ILMerge的这种事情(鉴于它正在做什么).
我的猜测是你的两个程序集使用相同的优化'技巧',一旦合并你就会得到冲突.
你有没有提出微软的错误?
同时解决方法是将源程序集作为单个程序集重新编译,从而节省了对ILMerge的需求.由于csproj文件只是XML列表,因此它们基本上很容易合并,您可以将其自动化为额外的MSBuild步骤.