Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DLL方法在C#中不可访问,但在VB.NET中不可访问_C#_Vb.net_Dll - Fatal编程技术网

DLL方法在C#中不可访问,但在VB.NET中不可访问

DLL方法在C#中不可访问,但在VB.NET中不可访问,c#,vb.net,dll,C#,Vb.net,Dll,我正在将遗留的VB.NET应用程序转换为C#应用程序。VB.NET应用程序引用了一个外部.DLL(ExternalLib.DLL),它具有类MyClass,该类实现了IMyClass 在VB.NET中,此代码编译和执行时不会出现问题: Dim external As New MyClass external.DoMethod(1) 在C#中,此代码引发编译时错误: MyClass external = new MyClass(); external.DoMethod(1); “Externa

我正在将遗留的VB.NET应用程序转换为C#应用程序。VB.NET应用程序引用了一个外部.DLL(ExternalLib.DLL),它具有类
MyClass
,该类实现了
IMyClass

在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应用程序正在使用带有
选项strict off
的后期绑定来访问ExternalLib.dll中的隐藏方法。使用
dynamic
关键字可以在C#应用程序中实现相同的行为:

dynamic external = new MyClass();
external.DoMethod(1);

(Blorgbeard为我指出了正确的方向,这真是太好了。)

VB.NET代码是否设置为
选项严格打开
或关闭
?可能已经晚了。
IMyClass
到底是从哪里来的?您似乎没有使用它..将C#@更改为
IMyClass external=…
,它可能也会工作。IMyClass在我使用“转到定义”时显示,并且有几个方法不包括DoMethod()。我认为这些信息可能会有帮助。VB.NET应用程序中的编译设置为:选项显式:打开、选项严格:关闭、选项比较:二进制、选项推断:Off@AlexeiLevenkov它不起作用(同样的错误。@Blorgbeard-我想你给了我一个主意。我将测试将
MyClass external
更改为
dynamic external
是否有效。良好的调用-VB允许你通过实例调用静态方法,这将解释op的情况(但C通常会发出更有用的错误消息…)。不幸的是,它不是静态方法。
MyClass.DoMethod(1)
导致
“ExternalLib.MyClass”不包含“DoMethod”的定义。