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

C#编译器错误地优化了代码,c#,asp.net,optimization,compiler-construction,ilmerge,C#,Asp.net,Optimization,Compiler Construction,Ilmerge,我有一个ASP.NET应用程序在远程web服务器上运行,我刚开始出现以下错误: Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'. 我在DLL中反汇编了代码,似乎编译器没有正确地优化代码。(请注意,Set是实现一组唯一对象的类。它继承自IEnumerable。)此行: Set<int> set = new Set<int>(); Set Set=newset(); 被编

我有一个ASP.NET应用程序在远程web服务器上运行,我刚开始出现以下错误:

Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'.
我在DLL中反汇编了代码,似乎编译器没有正确地优化代码。(请注意,Set是实现一组唯一对象的类。它继承自IEnumerable。)此行:

Set<int> set = new Set<int>();
Set Set=newset();
被编译成这一行:

Set<int> set = (Set<int>) new ICollection<CalendarModule>();
Set Set=(Set)新ICollection();
CalendarModule类是一个完全不相关的类!!以前有没有人注意到.NET错误地编译了这样的代码

更新#1:这个问题似乎是由微软的工具引起的。我们目前正在研究如何克服它

更新#2:到目前为止,我们找到了两种解决此问题的方法。我们不太了解根本问题是什么,但这两种方法都可以解决问题:

  • 关闭优化

  • 在另一台机器上用ILMerge合并汇编


  • 因此,我们不禁要问,构建机器是否以某种方式配置错误(考虑到我们已经使用该机器构建发行版一年多了,这很奇怪),或者是否存在其他问题。

    您确定您正在查看的程序集实际上是由相关源代码生成的吗?你能用一个小测试用例重现这个问题吗

    编辑:如果您使用的是Reflector,那么MSIL到C的转换可能不正确——Reflector在反编译时并非总是100%准确。MSIL看起来像什么


    编辑2:嗯。。。我刚刚意识到它不可能是Reflector的错误,否则您在运行时就不会收到该错误消息。

    最近是否在该服务器上部署了代码?有人会在你不知情的情况下推动构建吗?你能去源代码管理,获取最新的,并复制这个问题吗


    在这一点上,根据给定的信息,我怀疑是编译器

    与.Net编译相比,反射工具更可能出现此问题。您得到的错误-在远程处理期间未找到构造函数很可能是序列化问题(所有可序列化类都需要无参数构造函数)


    从反射工具中找到的代码更有可能引发类型转换异常。

    我同意Curt和Beds的观点;这听起来好像有严重的问题。优化器已经为我们所有人工作过了,而且还没有报告过这样的错误(据我所知)——这可能是因为事实上你做错了什么吗


    旁注:我还想指出.NETFX3.5中的
    System.Collections.Generic.HashSet
    ,它的功能与
    类的功能完全相同。

    。如果这真的是ILMerge的错,请及时更新您的发现——我使用ILMerge作为构建COM互操作程序集的关键步骤。

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

    我的猜测是,您的两个程序集使用的是相同的优化“技巧”,一旦合并,就会产生冲突

    你有没有向微软提出这个问题


    同时,一个解决方法是将源代码中的程序集作为单个程序集重新编译,从而省去了ILMerge的需要。由于csproj文件只是XML列表,它们基本上很容易合并,您可以将其作为额外的MSBuild步骤进行自动化。

    到目前为止,我无法用较小的测试用例重现该问题。在这种情况下,拆解似乎是正确的。我在引用ICollection构造函数时遇到的错误证明了这一点。这不足以调试您的问题。你能上传足够的代码来重现某个地方的问题吗?难道你不知道Int继承自CalenderModule吗?:)我绝对同意“选择不坏”学派的观点,这个错误可能不是由坏的编译器造成的,只是让它看起来像是坏的优化。感谢HashSet的提示,不幸的是我们还没有使用3.5,仍然使用2.0.Ok,但是异常抛出需要以下代码:new ICollection()我会告诉你我们发现了什么。关于如何在没有ILMerge的情况下使用cs/vb编译器将多个程序集编译为一个程序集,有人有什么好的资源吗?@Lamar:我以前已经回答过这个问题。看见