3

Reflection を使用して DLL ファイルで定義されたクラスをインスタンス化するのに問題があります。コードは問題ないように見えますが、Activator.CreateInstance で TargetInvocationException が発生します。コードは次のようになります (現在は 1 つの DLL のみが利用可能です)。

public Comparator() 
{
    string[] filePaths = Directory.GetFiles(@".\Extensions");
    for (int i = 0; i < filePaths.Length; ++i)
    {
        var asm = Assembly.LoadFrom(Path.GetFullPath(filePaths[i]));

        if (asm != null)
        {
            foreach (Type currType in asm.ExportedTypes)
            {
                if (!currType.IsAbstract && currType.IsPublic && typeof(SorterBase).IsAssignableFrom(currType))
                {
                    Debug.WriteLine(currType); //outputs: BubbleSort.Sorter
                    var instance = Activator.CreateInstance(currType); //TargetInvocationException
                }
            }
        }
    }
}

これは私がインスタンス化しようとしているクラスです:

using SortingLibrary;
using SortingFunctions;
namespace BubbleSort
{
    public class Sorter : SorterBase //SorterBase is an abstract class defined in SortingLibrary
    {
        public Sorter()
        {
            SetFunction(Sorting.BubbleSort);
            AlgorithmName = @"Bubble Sort";
        }
    }
}

その問題の発生を防ぐことができた唯一の方法は、ロードされた .dll をコンパイル前に参照に追加することでした。問題は、通常、コンパイル時にどのライブラリをロードする必要があるかを知る方法がないことです。ここで何が欠けていますか?

ソリューション全体 (現時点では少し面倒ですが) は、http: //nazr.in/rODからダウンロードできます。

どんな助けでも本当に感謝します!前もって感謝します。

4

1 に答える 1

5

すべての依存関係をフォルダ Extensions にコピーする必要があります。あなたの場合、BubbleSort.dll が依存する SortingFunctions.dll がありません。内部例外に反映されます。

于 2014-04-20T22:09:59.923 に答える