我创建了一个类库项目并构建它。现在我将Dll复制到“C:\”。现在我想用反射打开这个Dll:
using System.Reflection;
byte[] assem = System.IO.File.ReadAllBytes(@"c:\Company.dll");
var loadedAssem = Assembly.Load(assem);
Type thePersonType = loadedAssem.GetType();
var theObj = loadedAssem.CreateInstance("Company.Person");
// or var theObj = loadedAssem.CreateInstance("Company.Person")as IPlugin ;
Type[] paramTypes = new Type[1];
paramTypes[0] = Type.GetType("System.String");
MethodInfo PersonInfo = thePersonType.GetMethod("FullName", paramTypes);
Object[] parameters = new Object[1];
parameters[0] = "Mr. ";
Object returnVal = PersonInfo.Invoke(theObj, parameters);
MessageBox.Show(returnVal.ToString());
我无法调用我的“FullName”方法。 这是我的界面:
public interface IPlugin
{
String FullName(String PreName);
}
这是我的DLL中的Person类:
public class Person:IPlugin
{
public int PersonID { get; set; }
public String PersonName { get; set; }
public String PersonLName { get; set; }
public String FullName(String PreName)
{
return PreName+this.PersonName + this.PersonLName;
}
}
答案 0 :(得分:2)
你的问题在这一行:
Type theMathType = loadedAssem.GetType();
theMathType是Assembly,因此它不实现FullName。
你应该这样做:
Type theMathType = loadedAssem.GetType("Company.Person");
顺便说一句,如果你使用:
实例化theObjIPlugin theObj = Activator.CreateInstance(theMathType) as IPlugin;
然后你可以简单地写(不使用反射来调用方法):
theObj.FullName("Mr. ");
答案 1 :(得分:2)
您正在调用GetType()
,它会返回Assembly
作为类型。这显然不是你想要的类型。要枚举程序集中声明的类型,请使用Assembly.GetTypes()
方法
要查找实现IPlugin
的所有类型,您可以使用以下代码:
Type[] iPluginTypes = (from t in loadedAssem
where !t.IsInterface && !t.IsAbstract
where typeof(IPlugin).IsAssignableFrom(t)
select t).ToArray();
另外(如果还没有完成)我建议您在一个程序集中声明接口IPlugin
,该程序集可以通过加载插件的代码以及插件本身访问(也许只是一个单独的程序集)对于像这样的可扩展性类型)。
这样你就可以将结果转换为接口并正常使用它。必须用反射类调用接口方法才能破坏需要这种接口的目的。
答案 2 :(得分:1)
我用这个代码解决了这个问题。我们应该在一个单独的类库中使用接口“IPlugin”并在其他项目中使用。
Assembly objAssembly = Assembly.LoadFrom("Company.dll");
Type objAssemblyType = objAssembly.GetType();
foreach (Type type in objAssembly.GetTypes())
{
if (type.IsClass == true)
{
var classInstance = objAssembly.CreateInstance(type.ToString()) as IPlugin;
lblFullName.Text = classInstance.FullName("Mr. ");
}
}