3

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

Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'.

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

Set<int> set = new Set<int>();

编译成这一行:

Set<int> set = (Set<int>) new ICollection<CalendarModule>();

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

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

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

  1. 关闭优化。

  2. 在另一台机器上将程序集与 ILMerge 合并。

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

4

6 回答 6

7

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

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

您是否向 Microsoft 提出了该错误?

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

于 2008-09-24T07:57:29.453 回答
1

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

编辑:如果您使用反射器,则 MSIL 到 C# 的转换可能不正确——反射器在反编译时并不总是 100% 准确。MSIL 是什么样的?

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

于 2008-09-23T20:10:50.963 回答
1

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

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

于 2008-09-23T20:19:35.950 回答
1

我同意 Curt 和 Beds 的观点;这听起来像是严重错误。优化器对我们所有人都有效,并且没有报告过这样的错误(据我所知)——难道你实际上做错了什么?

旁注:我还想指出System.Collections.Generic.HashSet<T>.Net fx 3.5 中的哪个,并且完全符合一个Set<>类的要求。

于 2008-09-23T20:20:05.590 回答
0

代码最近是否部署到该服务器?有人会在您不知情的情况下推动构建吗?你能去源代码控制,拉最新的,然后复制问题吗?

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

于 2008-09-23T20:17:59.823 回答
0

哎哟。如果这确实是 ILMerge 的错误,请根据您的发现及时更新本主题——我使用 ILMerge 作为构建 COM 互操作程序集的关键步骤。

于 2008-09-23T21:32:21.593 回答