我正在将传统的VB.NET应用程序转换为C#应用程序。VB.NET应用程序引用了一个外部.DLL(ExternalLib.DLL),该DLL具有实现IMyClass
的类MyClass
。
在VB.NET中,此代码编译和执行都没有问题:
Dim external As New MyClass
external.DoMethod(1)
在C#中,这段代码抛出一个编译时错误:
MyClass external = new MyClass();
external.DoMethod(1);
"ExternalLib.MyClass"不包含"DoMethod"的定义,并且没有接受类型为的第一个参数的扩展方法"DoMethod"未能找到"ExternalLib.MyClass"(是否缺少使用指令还是程序集引用?)
从元数据来看,IMyClass
没有DoMethod()
。在VB.NET的Intellisense中,DoMethod()
并没有出现在其他可用的公共方法中,但所有方法的编译和运行都很好。
DoMethod()
是静态方法还是实例方法?如果它是一个静态方法,可以解释为什么在接口中看不到它。您需要将您的C#代码更改为:
MyClass.DoMethod(1);
VB.NET应用程序正在使用与option strict off
的后期绑定来访问ExternalLib.dll中的隐藏方法。使用dynamic
关键字可以在C#应用程序中实现相同的行为:
dynamic external = new MyClass();
external.DoMethod(1);
(感谢Blorgbeard为我指明了正确的方向。)