我在使用Reflection实例化DLL文件中定义的类时遇到了一些麻烦。即使代码看起来很好,我在Activator.CreateInstance上得到了TargetInvocationException。代码如下(现在只有一个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
任何帮助都将非常感谢!提前谢谢。
答案 0 :(得分:3)
您必须将所有依赖项复制到Extensions文件夹。在您的情况下,您缺少BubbleSort.dll依赖的SortingFunctions.dll。它反映在内部异常中。