【发布时间】:2016-11-22 13:47:29
【问题描述】:
过去,我编写了一个应用程序,它可以根据数据库中的值动态加载 DLL 及其所有依赖项,如下所示(清理了一些参数)
VB
Dim oType As System.Type
Dim oAssembly As System.Reflection.Assembly
Dim oObject As System.Object
oAssembly = Assembly.LoadFrom(path)
oType = oAssembly.GetType("LogicValidator")
oObject = Activator.CreateInstance(oType)
oObject.Initialise("param1", "param2", "param3", AuditTrail, UserInfo, workingDir)
Console.WriteLine("Begin processing...")
oObject.ProcessBatch(cm_uid)
现在,当我在 C# 中编写类似的东西时,在构建应用程序之前出现错误,说明如下:
C#
System.Type oType = default(System.Type);
System.Reflection.Assembly oAssembly = default(System.Reflection.Assembly);
System.Object oObject = null;
oAssembly = Assembly.LoadFrom(path);
oType = oAssembly.GetType("LogicValidator");
oObject = Activator.CreateInstance(oType);
oObject.Initialise("param1", "param2", "param3", AuditTrail, UserInfo, workingDir);
Console.WriteLine("Begin processing...");
oObject.ProcessBatch(cm_uid);
错误
“object”不包含“Initialise”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“Initialise”(您是否缺少 using 指令或程序集引用?)1234565 >如果某个方法在运行时加载,我的 C# 应用程序如何在编译之前识别该方法不存在?
编辑
为了帮助其他偶然发现这个问题的人,我删除了以下内容。虽然它确实指出了答案,但其他人回答得更有说服力。 :-)
我想补充一点,以下内容有效 - 但前提是加载的程序集依赖项已经存在。var DLL = Assembly.LoadFile(path); Type type = DLL.GetType("LogicValidator"); dynamic c = Activator.CreateInstance(type); c.Initialise("param1", "param2", "param3", audit, UserInfo, workingDir); Console.WriteLine("Begin processing..."); c.ProcessBatch(cm_uid);
【问题讨论】:
-
不要使用
System.Object作为oObject的类型,使用你需要的实际类型(即LogicValidator)。否则dynamic可能是你最好的选择。