あるアセンブリの 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
ThirdParty
VS2008 と ProcExp によると、DLL は複数の場所からロードされています。1 つはリファレンス パスから、もう 1 つはビルド ディレクトリからです。DLL の MD5 ダイジェストが一致します。
ThirdParty
DLL のコピーが 1 つだけであることを確認して、すべてを新しいディレクトリにコピーすると、プログラムは正常に動作します。
ThirdParty
「ローカルにコピー」をオフにするすべての参照。それでも、コピーがFirstParty\bin\Debug
.
他に何を確認すればよいですか?MissingMethodException
ビルド製品をコピーするビルド後のスクリプトを除いて、デバッグ中に防止するにはどうすればよいですか?