2015-02-11 4 views
1

Я в процессе преобразования устаревшего приложения VB.NET в приложение C#. Приложение VB.NET ссылается на внешний .DLL (ExternalLib.dll), который имеет класс MyClass, который реализует IMyClass.DLL-методы недоступны в 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(). В Intellisense VB.NET DoMethod() не отображается среди других доступных общедоступных методов, но все компилируется и выполняется просто отлично.

+3

ли код VB.NET установлен в 'вариант строгого on' или 'off'? Это может быть поздняя привязка. Где именно «IMyClass» входит в него? Кажется, вы не используете его. – Blorgbeard

+0

Измените C# @ на 'IMyClass external = ...', и он, скорее всего, тоже будет работать. –

+0

IMyClass появляется, когда я использую «Перейти к определению» и имеет несколько методов, которые не включают DoMethod(). Я думал, что информация может быть полезна. Параметры компиляции в приложении VB.NET: Опция явная: Вкл., Опция строгая: Выкл., Опция сравнения: Двоичный, Опция: – Kcoder

ответ

0

Приложение VB.NET использует позднего связывания с option strict off доступ к скрытому метод в ExternalLib.dll. Использование dynamic ключевого слова позволяет такое же поведение в C# приложении: (. Престижность Blorgbeard указал мне в правильном направлении)

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

1

Есть DoMethod() статический метод или метод экземпляра? Если бы это был статический метод, который бы объяснил, почему вы не видите его в интерфейсе. Вы должны изменить свой код C# это:

MyClass.DoMethod(1); 
+1

Хороший вызов - VB позволяет вам позвонить статический метод через экземпляр, который объясняет случай op (но C# обычно выдавал бы более полезное сообщение об ошибке ...) –

+0

К сожалению, это не статический метод. MyClass.DoMethod (1) 'приводит к' ExternalLib.MyClass 'не содержит определения для DoMethod'' – Kcoder