[解決済み】TypeLoadExceptionが「実装がない」というが、実装はされている
質問
テストマシンで非常に奇妙なバグが発生しました。エラーの内容は
System.TypeLoadException: Method 'SetShort' in type 'DummyItem' from assembly 'ActiveViewers (...)' does not have an implementation.
どうしても理解できない。
SetShort
があるのは
DummyItem
また、デプロイやバージョン管理の問題でないことを確認するために、イベントログへの書き込みがあるバージョンを再コンパイルしました。 奇妙なことに、呼び出し側のコードでは
SetShort
メソッドを使用します。
どのように解決するのですか?
注意事項 - この回答がお役に立たなかった場合は、他の回答が追加されていますので、スクロールダウンしてご覧ください。
短い回答
これは、あるアセンブリのインターフェースにメソッドを追加し、さらに別のアセンブリの実装クラスにメソッドを追加したときに、インターフェースアセンブリの新しいバージョンを参照せずに実装アセンブリを再構築した場合に発生する可能性があります。
この場合、DummyItemは他のアセンブリのインターフェイスを実装しています。SetShort メソッドは、最近、インターフェースと DummyItem の両方に追加されましたが、DummyItem を含むアセンブリは、以前のバージョンのインターフェース アセンブリを参照してリビルドされました。そのため、SetShort メソッドは事実上存在しますが、インターフェイスの同等のメソッドにリンクする魔法のソースはありません。
長い回答
再現してみたい方は、以下を試してみてください。
-
クラスライブラリプロジェクトを作成します。InterfaceDefを作成し、クラスを1つだけ追加し、ビルドします。
public interface IInterface { string GetString(string key); //short GetShort(string key); }
-
2つ目のクラスライブラリプロジェクトを作成します。InterfaceDef.dllをプロジェクトディレクトリにコピーし、ファイル参照として追加し、クラスを1つだけ追加し、ビルドします。
public class ImplementingClass : IInterface { #region IInterface Members public string GetString(string key) { return "hello world"; } //public short GetShort(string key) //{ // return 1; //} #endregion }
-
3つ目の、コンソールプロジェクトを作成します。ClientCodeを作成し、2つのDLLをプロジェクトディレクトリにコピーし、ファイル参照を追加し、次のコードをMainメソッドに追加します。
IInterface test = new ImplementingClass(); string s = test.GetString("dummykey"); Console.WriteLine(s); Console.ReadKey();
-
コードを一度実行すると、コンソールに "hello world" と表示されます。
-
2つのDLLプロジェクトのコードをアンコメントし、再構築します。2つのDLLをClientCodeプロジェクトにコピーし直し、再構築して、再度実行してみてください。ImplementingClassをインスタンス化しようとすると、TypeLoadExceptionが発生します。
関連
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C#のインターフェイス。暗黙の実装と明示の実装
-
[解決済み] NULL-COALESCING 演算子のカスタム暗黙変換の不思議な挙動
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
-
[解決済み】.NET FrameworkでMath.Pow()はどのように実装されていますか?
-
[解決済み] アセンブリのバージョン番号を管理するためのベストプラクティス/ガイダンス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] 関数を終了するには?
-
[解決済み】C#や.NETで見た最も奇妙なコーナーケースは何ですか?[解決済み]
-
[解決済み】.NETのAPIブレークスルーのための決定版ガイド