2015-02-11 114 views
1

我正在將遺留的VB.NET應用程序轉換爲C#應用程序。 VB.NET應用程序引用具有類MyClass的外部.DLL(ExternalLib.dll),該類執行IMyClassDLL方法在C#中無法訪問,但在VB.NET中無法訪問

在VB.NET,這個代碼編譯,沒有問題,執行:

Dim external As New MyClass 
external.DoMethod(1) 

在C#,這代碼拋出一個編譯時間錯誤:

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

'ExternalLib.MyClass' does not contain a definition for 'DoMethod' and no extension method 'DoMethod' accepting a first argument of type 'ExternalLib.MyClass' could be found (are you missing a using directive or an assembly reference?)

綜觀元數據,IMyClass沒有DoMethod()。在VB.NET的Intellisense中,DoMethod()不會顯示在其他可用的公共方法中,但是所有內容都可以編譯並運行。

+3

是在VB.NET代碼設置爲'選項嚴格在'或'關'上?這可能是遲到的約束。 「IMyClass」到底在哪裏?你似乎沒有使用它.. – Blorgbeard 2015-02-11 01:02:44

+0

改變C#@到'IMyClass external = ...',它也可能工作。 – 2015-02-11 01:12:14

+0

當我使用「轉到定義」並且有幾個方法不包含DoMethod()時,IMyClass會顯示出來。我認爲這些信息可能會有所幫助。 VB.NET應用程序中的編譯設置是:Option explicit:On,Option strict:Off,Option compare:Binary,Option infer:Off – Kcoder 2015-02-11 01:12:46

回答

0

的VB.NET應用程序使用後期綁定與option strict off訪問ExternalLib.dll隱藏的方法。使用dynamic關鍵字允許在C#應用程序相同的行爲:(榮譽給Blorgbeard指着我在正確的方向)

​​

1

DoMethod()是靜態方法還是實例方法?如果它是一個靜態方法,可以解釋爲什麼你不能在界面中看到它。你需要改變你的C#代碼到這一點:

MyClass.DoMethod(1); 
+1

好的調用 - VB允許你調用通過一個實例的靜態方法,這將解釋操作的情況(但C#通常會發出一個更有用的錯誤消息...) – 2015-02-11 01:28:22

+0

不幸的是,它不是一個靜態方法'MyClass.DoMethod(1)'導致'' ExternalLib.MyClass'不包含'DoMethod'的定義 – Kcoder 2015-02-11 02:53:34