1

だからここに私の問題があります。Assembly.LoadFrom("x.dll") を介してロードしようとしているインターフェイスと抽象クラスの複雑なアーキテクチャがあります。基本クラスで実装が明示的であるインターフェイス実装を持つ特定の型をロードしようとすると、次のように TypeLoadException が発生します。

アセンブリ 'MyPart2Assembly、バージョン...' のタイプ 'MyPart2DerivedType' のメソッド 'MyMethod' には実装がありません。いくつかの記事を読み、obj ファイルと dll を手動で削除しようとしたこともあるため、これがなぜなのかを理解しようとしています。これまでに私が行ったことへの参照は次のとおりです。

TypeLoadException の解決策

TypeLoadException は「実装なし」と言っていますが、実装されています

Visual Studio フォーラム: TypeLoadException

プライベート アクセサーと明示的なインターフェイスの実装

だからここに私のコード例があります:

//This is in project 1
public interface IFooPart1
{
    void DoStuff();
}

//This is in project 2
public interface IFooPart2
{
    void DoOtherStuff();
}

//This is in project 3
public interface IFooPart3: IFooPart1, IFooPart2
{
    void DoEvenMoreStuff();
}

//This is in project 4
public abstract class MyBaseType: IFooPart1, IFooPart2
{
    void IFooPart1.DoStuff()
    {
        DoStuffInternal();
    }

    void IFooPart2.DoOtherStuff()
    {
        DoOtherStuffInternal();
    }
}

//This is in project 5
public class MyDerivedType: MyBaseType, IFooPart3
{
    public void DoEvenMoreStuff()
    {
        //Logic here...
    }
}

//Only has references to projects 1, 2, & 3 (only interfaces)
public class Program
{
    void Main(params string[] args)
    {
        //Get the path to the actual dll
        string assemblyDll = args[0];

        //Gets the class name to load (full name, eg: MyNameSpace.MyDerivedType)
        string classNameToLoad = args[1];

        //This part works...
        var fooAssembly = Assembly.LoadFrom(assemblyDll);

        //Here we throw a TypeLoadException stating
        // Method 'DoStuff' in type 'MyDerivedType' from assembly 'Project 5...' does
        //  not have an implementation.
        Type myDerivedTypeExpected = Assembly.GetType(classNameToLoad);
    }
}

注:明示的な実装を MyBaseType ではなく MyDerivedType に移動すると動作します...しかし、なぜそうしなければならないのかわかりません。できるはずのようです。このコードは単なる例です。実際のコードには、ロードされたクラスを返すファクトリがありますが、インターフェイス タイプを介してのみです。(例: var myDerivedType = GetInstance();)

4

2 に答える 2

3

私のばかげた修正に興味がある人なら誰でも大丈夫です。これが私の問題でした:

Project6 (コンソール アプリ) には、ビルド先の場所にある dll への参照ではなく、他のプロジェクトへの PROJECT 参照があります。他のプロジェクトは、実際には特定のリポジトリ領域に構築されていました。したがって、コンソール アプリケーションは、依存関係を自動的にロードしようとしたときに、独自のバージョンの dll を使用していました。これにより、そこにあったdllと同じフォルダーにないため、動的にロードされていた他のタイプの方法が明らかにロードされませんでした...

つまり、Assembly.LoadFrom によってアセンブリが 2 回読み込まれる可能性がありますが、.NET はそれを別のアセンブリとして扱います!!! これにより、タイプを動的にロードしようとすると、いくつかの実際の奇妙なエラーが発生する可能性があります!!!

私の欲求不満/間違いから学んでください。フィーンドは、友人の DI を放っておけません (コードのレビューは、このばかげたことを見つけるための鍵です)。

于 2013-09-10T16:01:07.100 に答える
1

私のプロジェクトの 1 つが古いバージョンの nuget パッケージの依存関係を参照していることが原因で、同様の問題が発生しました。古いバージョンには、いずれかのメソッドの実装がありませんでした。

于 2016-05-24T10:29:36.093 に答える