TypeLoadException は「実装なし」と表示しますが、実装されています 質問する

TypeLoadException は「実装なし」と表示しますが、実装されています 質問する

テストマシンに非常に奇妙なバグが発生しました。エラーは次のとおりです:

System.TypeLoadException: Method 'SetShort' in type 'DummyItem' from assembly 'ActiveViewers (...)' does not have an implementation.

なぜなのか理解できません。クラスSetShort内に存在しDummyItem、デプロイメント/バージョン管理の問題ではないことを確認するために、イベント ログへの書き込みを含むバージョンを再コンパイルしました。奇妙なのは、呼び出しコードがメソッドを呼び出さないことですSetShort

ベストアンサー1

注意- この回答が役に立たない場合は、時間をかけて下にスクロールして、それ以降に追加された他の回答を確認してください。

本当に短い答え

すべてのディレクトリbinobjディレクトリを削除し、すべてを再構築してください。dll のバージョンが一致しません。

短い答え

これは、あるアセンブリのインターフェイスにメソッドを追加し、次に別のアセンブリの実装クラスに追加したが、インターフェイス アセンブリの新しいバージョンを参照せずに実装アセンブリを再構築した場合に発生する可能性があります。

この場合、DummyItem は別のアセンブリからインターフェイスを実装します。SetShort メソッドは最近インターフェイスと DummyItem の両方に追加されましたが、DummyItem を含むアセンブリは以前のバージョンのインターフェイス アセンブリを参照して再構築されました。そのため、SetShort メソッドは事実上存在しますが、インターフェイス内の同等のメソッドにリンクする魔法のソースはありません。

長い答え

これを再現したい場合は、次の操作を試してください。

  1. クラス ライブラリ プロジェクト「InterfaceDef」を作成し、クラスを 1 つだけ追加してビルドします。

     public interface IInterface
     {
         string GetString(string key);
         //short GetShort(string key);
     }
    
  2. 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. 3 番目のコンソール プロジェクト ClientCode を作成し、2 つの dll をプロジェクト ディレクトリにコピーし、ファイル参照を追加して、次のコードを Main メソッドに追加します。

      IInterface test = new ImplementingClass();
      string s = test.GetString("dummykey");
      Console.WriteLine(s);
      Console.ReadKey();
    
  4. コードを一度実行すると、コンソールに「hello world」と表示されます。

  5. 2 つの dll プロジェクトのコードのコメントを解除して再構築します。2 つの dll を ClientCode プロジェクトにコピーし、再構築して再度実行します。ImplementingClass をインスタンス化しようとすると、TypeLoadException が発生します。

おすすめ記事