0

我正在尝试使用以下代码在我的项目中加载旧版本的 farpoint dll

     System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(@"FarPoint.Web.Spread.dll");
    System.Type MyDLLFormType = assembly.GetType("FarPoint.Web.Spread.FpSpread");
    var c = Activator.CreateInstance(MyDLLFormType);

问题是在创建实例后,farpoint 的所有可用方法都不可用[例如-如果我直接创建对象,则实例可以使用 saveExcel 或 savechanges 等方法]

                FpSpread fpProxyObject = new FpSpread();
                fpProxyObject.SaveExcel();
4

2 回答 2

1

它们是可用的,只是在编译时不可用。Activator.CreateInstance()返回一个object. 您当然可以投射对象:

var c = Activator.CreateInstance(...)
FpSpread fpProxyObject = (FpSpread)c;

但这可能会超出使用反射创建实例的全部目的。

您可以使用反射访问结果对象的所有成员,即:

MethodInfo saveExcelMethod = c.GetType().GetMethod("SaveExcel");
if (saveExcelMethod == null) throw new ApplicationException("Incorrect version of FarPoint");
saveExcelMethod.Invoke(c);
于 2015-08-04T17:18:21.250 回答
1

Intellisense 不起作用,因为正如@C.Evenhuis 所说,Activator.CreateInstance返回object,所以你应该将它转换为适当的类型。

如果在编译时类型未知,但您可以访问代码库,您可以尝试为其添加接口,并由您的类实现它。然后将对象转换为该接口并使用它。(我不知道您的目的,但接口可以被视为所有类型的合同,您将动态加载)。

如果在编译时类型未知并且您无权访问代码库,则可以使用反射进行方法调用或dynamic改用。

dynamic c = Activator.CreateInstance(MyDLLFormType);
c.SaveExcel(); // this method invocation will be bound in runtime.

顺便说一句,使用时要小心Assembly.LoadFile。您可以从这篇文章中获得更多详细信息。

于 2015-08-04T17:49:03.693 回答