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:これまでに、この問題を解決する方法が 2 つあります。根本的な問題が何であるかはよくわかりませんが、これらの両方で修正されます。

  1. 最適化をオフにします。

  2. 別のマシンで ILMerge を使用してアセンブリをマージします。

そのため、ビルド マシンの構成が何らかの形で間違っているのか (1 年以上マシンを使用してリリースをビルドしていることを考えると奇妙です)、それとも他の問題なのか疑問に思っています。

4

6 に答える 6

7

ああ、ILMerge-あなたの質問のその余分な情報は本当にあなたの問題に役立ちます。.netコンパイラがこのように失敗することは決して期待していませんが、ILMergeでこの種のことが時々見られることを期待します(それが何をしているのかを考えると)。

私の推測では、2つのアセンブリが同じ最適化「トリック」を使用しており、マージされると競合が発生します。

Microsoftでバグを提起しましたか?

当面の回避策は、ソースからアセンブリを単一のアセンブリとして再コンパイルし、ILMergeの必要性をなくすことです。csprojファイルは単なるXMLリストであるため、基本的に簡単にマージでき、追加のMSBuildステップとして自動化できます。

于 2008-09-24T07:57:29.453 に答える
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 に答える
1

見ているアセンブリが実際に問題のソース コードから生成されたものであると確信していますか? 小さなテスト ケースでこの問題を再現できますか?

編集: Reflector を使用している場合、MSIL から C# への変換が正しくない可能性があります。Reflector は逆コンパイル時に常に 100% 正確であるとは限りません。MSIL はどのように見えますか?

編集 2:うーん...それがリフレクターに問題がある可能性がないことに気付きました。そうしないと、実行時にそのエラー メッセージが表示されないことに気付きました。

于 2008-09-23T20:10:50.963 に答える
0

ああ。これが本当に ILMerge に問題がある場合は、このトピックを最新の状態にしておいてください。私は、COM 相互運用アセンブリを構築する際の重要なステップとして ILMerge を使用しています。

于 2008-09-23T21:32:21.593 に答える
0

コードは最近そのサーバーにデプロイされましたか? あなたの知らないうちに誰かがビルドをプッシュした可能性はありますか? ソース管理に行き、最新のものを取り出し、問題を再現できますか?

この時点で、与えられた情報では、それがコンパイラであるとは思えません。

于 2008-09-23T20:17:59.823 に答える