2

あるアセンブリの VB.NET コードを、別のアセンブリの C# コードから呼び出しています。コードは正常にビルドされますがMissingMethodException、呼び出しを行うと取得されます。

MethodMissingException通常、私が読んだStack Overflow と Google の検索結果によると、これは、ビルドしている DLL と実行している DLL が一致していないことが原因です。3 番目の DLL について言及している結果はありません。詳細については、以下をご覧ください。

私はそれを確認しました:

  • デバッグ中の VS2008 出力ウィンドウによると、ターゲット DLL のパスは参照のパスと一致します。
  • ProcExp によると、これがシステムにロードされたターゲット DLL の唯一のバージョンです。
  • コードによると、「欠落」メソッドが存在します
  • 生成された XML ドキュメントによると、「欠落している」メソッドが存在します。
  • Reflectorによると、「欠落」メソッドが存在します

最も強力な手がかりは、「欠落している」メソッドのシグネチャで使用される型を含むアセンブリの重複読み込みです。SecondPartyそれは(私が参照している)とFirstParty(コピーローカルセットがオフになっている)の両方から来ています。

すべてを新しいディレクトリに手動でコピーすると、問題が解決します。ただし、これによりデバッグが難しくなります。私は緑色の三角形を押すのが好きです。

詳細:

厳密に型指定された ADO.NET DataSet を含む 3 番目のアセンブリがあります。タイプを呼び出しましょうThirdParty.PortableData。私FirstPartyはそれをデータで埋めてに渡していSecondPartyます。

失敗している呼び出しコードはFirstParty次のようになります。

ThirdParty.PortableData data = GetPortableData()
SecondParty instance = new SecondParty()
instance.Data = data

(MissingMethodExceptionは、このコードを含むメソッドを呼び出す行からスローされます。)

SecondParty実行時にFirstParty見つからないように見えるターゲット コードは次のようになります。

Public Property Data() As ThirdParty.PortableData
    Get
        ' ...
    End Get

    Set(ByVal value As ThirdParty.PortableData)
        ' ...
    End Set
End Property

少し異なる呼び出しコードで、私も試しました:

Public Sub SetData(ByVal value as ThirdParty.PortableData) 
    ' ...
End Sub

ThirdPartyVS2008 と ProcExp によると、DLL は複数の場所からロードされています。1 つはリファレンス パスから、もう 1 つはビルド ディレクトリからです。DLL の MD5 ダイジェストが一致します。

ThirdPartyDLL のコピーが 1 つだけであることを確認して、すべてを新しいディレクトリにコピーすると、プログラムは正常に動作します。

ThirdParty「ローカルにコピー」をオフにするすべての参照。それでも、コピーがFirstParty\bin\Debug.

他に何を確認すればよいですか?MissingMethodExceptionビルド製品をコピーするビルド後のスクリプトを除いて、デバッグ中に防止するにはどうすればよいですか?

4

3 に答える 3

0

必要なツールはFusion Log Viewerです。ロードする正しいアセンブリを見つけようとしたときに CLR が実行した正確な手順が示されます。

于 2009-05-22T00:14:06.883 に答える
0

すべてのファイルを新しいクリーン マシンにコピーします。バージョン番号を信頼しないでください。問題が存在するかどうかを確認します。私の推測では、あなたの問題はクリーンなマシンで修正されるでしょう。

動作する場合は、マシンに戻って各 DLL のグローバル検索を実行し、そのハッシュを実行して、期待どおりの正確なファイルであることを確認します。

バージョン番号 (1.0.0.0) をハードコードし、マシン上に 5 つの異なる DLL のコピー (ローカル ディレクトリ、共有フォルダー、GAC など) を持っている場合に、これが頻繁に発生します。

于 2009-05-20T19:29:26.230 に答える