web-dev-qa-db-ja.com

System.TypeLoadException:メソッド 'get_xxx'には実装がありません

この問題にはたくさんの質問が浮かんできて、私は喜びもなくそれらを解決してきました。

このエラーが発生しました:

アセンブリ 'App.Web、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null'のタイプ 'App.Web.WebConfig'のメソッド 'get_UserImageCDNUrl'には実装がありません。

App.Webへの参照がないApi.Webを実行しようとしているので、これは本当に奇妙です。共通しているのは、他のプロジェクト(Models.DomainとModels.DTO)への参照だけです。

私はインターフェースを持っています:

IResourceCompilerアセンブリ "Models.Domain"内

WebConfigBaseと呼ばれる同じアセンブリ(Models.Domain)にこのインターフェイスを実装する抽象クラスがあります

「App.Web」プロジェクトと「Api.Web」プロジェクトでは、それぞれにWebConfigというクラスがあります。これらはWebConfigBaseから継承するため、両方ともWebConfig AppとApiのクラスは、IResourceCompilerの実装です。

プロパティを追加しようとしました

string UserImageCDNUrl {get;}

to IResourceCompilerそしてプロパティをWebConfigBaseに追加しました

public string UserImageCDNUrl 
{
    get { return ""; } 
}

したがって、プロパティは、独自のWebConfigクラスを介して、ApiプロジェクトとWebプロジェクトの両方にアクセスでき、上記の例外が発生します。

私はこれが喜びなしで起こる理由を確かめるために何時間も探しました。

Objフォルダーをクリアし、クリーンアップ、再構築、GAC内のインスタンスをチェックしました(インスタンスはありません)が、まだこれに固執しています。

インターフェイス(および基本クラス)に新しいプロパティを追加しようとするまで、すべてが正常に機能します

5
pieperu

OK、奇妙なことにApi.WebにApp.Webへの参照を追加し、それを再度削除することで問題は解決しました。

理由はわかりませんが、わかりました。

App.Webのバージョンを1.0.0.1に変更しましたが、エラーにはまだ1.0.0.0が表示されていたため、それを実行するように促されました。

もっと合理的な説明があればいいのですが、ありません。そのような腹立たしい問題は、私がそれでやられてうれしいです。

これを経験している他の人に幸運を祈ります、私の考えはあなたと一緒です

4
pieperu

これには多くの理由が考えられます。これまでの回答はすべて、この問題の事例を表しています。

私が提案することは次のとおりです。
プログラムの実行中に、[リソースモニター]-> [CPU]タブを開き、[ハンドルの検索]入力ボックスで、そのメソッドを実装していないと思われるアセンブリを検索します。

検索結果には、アセンブリのパスが表示されますが、表示されるパスは、予想したものではない可能性があります。
この予期しないパスからアセンブリを削除して、正しいアセンブリが読み込まれるようにします。

2
janos laszlo

記録として、私の場合、これは同じパッケージの異なるバージョンを参照している2つのプロジェクトが原因でした。少なくともこれを修正することで問題は解決しました。

1
Nicholas Reis

多くの場合、私はこのエラーになります。 Cached Assemblyのようで、UserProfileで見つけました。

私の解決策は次のとおりです。

  1. ソリューションを保存してVisualStudioを閉じます
  2. フォルダー全体を削除します "c:\ Users(user)\ AppData\Local\Microsoft\VisualStudio\14.0\ProjectAssemblies \"
  3. VisualStudioを起動します
  4. 作業...

それが役に立てば幸い。

1
Vojta Novák

現在のプロジェクトの参照(エラーが表示されています)を削除し、これが参照されたプロジェクトがビルドされている他のプロジェクトに再度追加すると、正常に動作し始めます。

これが誰かを助けることを願っています。

1
Usman Younas

これを試して

public interface IResourceCompiler
{
    string UserImageCDNUrl {get;}
}

public abstract class WebConfigBase : IResourceCompiler
{
    public abstract string UserImageCDNUrl {get;}
}

public class WebConfig : WebConfigBase 
{
    public override string  UserImageCDNUrl { return "whatever you want";}
}

またはそのようにも:

public interface IResourceCompiler
{
    string UserImageCDNUrl {get;}
}

public abstract class WebConfigBase : IResourceCompiler
{
    public virtual string UserImageCDNUrl {get { return string.empty;}}
}

public class WebConfig : WebConfigBase 
{
    public override string  UserImageCDNUrl { return "whatever you want";} // or return base.UserImageCDNUrl ;
}
0
BriceR