我正在尝试使用带反射的预编译DLL来实例化DLL中的类的接口。我试过这本书,但它不起作用。当我尝试执行以下操作时,它会抛出InvalidCastException:
ICompute iCompute = (ICompute)Activator.CreateInstance(type);
其中类型的课程是我的类,它实现了ICompute接口。我被困住了,不知道该怎么办。完整的代码如下:
这是DLL内容:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication18
{
public class ClassThatImplementsICompute : ICompute
{
public int sumInts(int term1, int term2)
{
return term1 + term2;
}
public int diffInts(int term1, int term2)
{
return term1 - term2;
}
}
}
实际节目:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication18
{
public interface ICompute
{
int sumInts(int term1, int term2);
int diffInts(int term1, int term2);
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Loading dll...");
Assembly assembly = Assembly.LoadFrom("mylib.dll");
Console.WriteLine("Getting type...");
Type type = assembly.GetType("ConsoleApplication18.ClassThatImplementsICompute");
if (type == null) Console.WriteLine("Could not find class type");
Console.WriteLine("Instantiating with activator...");
//my problem!!!
ICompute iCompute = (ICompute)Activator.CreateInstance(type);
//code that uses those functions...
}
}
}
任何人都可以帮助我吗?谢谢!
答案 0 :(得分:1)
问题在于如何使用Assembly.LoadFrom()
加载程序集。
LoadFrom()
接口的上下文相比, ICompute
将程序集加载到不同的上下文中。如果可能,请尝试使用Assembly.Load()
。即将程序集放入bin / probing path文件夹并以完整的强名称加载。
一些参考文献: http://msdn.microsoft.com/en-us/library/dd153782.aspx http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx(请参阅LoadFrom的不利位置)