Ошибка несоответствия типов при вызове C # dll из VBA с использованием com-взаимодействия - PullRequest
3 голосов
/ 07 января 2010

Каковы ограничения для параметров при вызове методов C # из кода VBA с использованием взаимодействия COM?

Я обнаружил, что если я вызываю метод, который принимает один простой тип (string, int и т. Д.), Он работает, но вызов метода, который принимает пользовательский класс в качестве параметра, завершается неудачей - с ошибкой «Несовпадение типов» во время компиляции кода VBA.

C # код:

public namespace foo {
    public class XXX { }

    public class Service {
        public setString(String val) { ... }
        public setXXX(XXX val) { ... }
    }
}

Код VBA:

Dim service As New foo.Service
service.setString("this works")

Dim complexClass as New foo.XXX 

Rem This fails with a type mismatch error
service.setXXX(complexClass)

Как упоминалось выше, компилятор VBA блокирует эту строку: service.setXXX (complexClass)

Есть мысли?

1 Ответ

1 голос
/ 07 января 2010

Сигнатуры методов для setString и setXXX являются неполными в вашем примере кода, поскольку в нем не указано, возвращает ли он void или какой-либо другой тип данных. Если setXXX возвращает void, попробуйте удалить круглые скобки вокруг параметра (ов) при вызове метода VBA, например:

service.setXXX complexClass

Пояснение:

В VBA не следует заключать аргументы субротажа в круглые скобки. Это можно легко проверить, создав подпрограмму с двумя параметрами и попытавшись вызвать ее, заключив аргументы в круглые скобки:

//C#
public void setXXX2(XXX val, XXX val2) { }

.

'VB
service.setXXX2 (complexClass, complexClass) 'Error

Возвращаясь к вашему примеру, когда вы заключили свой единственный аргумент в круглые скобки, вы создали выражение в скобках , которое оценивает простое значение данных - в данном случае типа String.

Вы можете убедиться, что вы добавили новый метод - который я назвал GetParameterType - в ваш класс для тестирования:

public class Service { 
    public void setString(String val) {  }
    public void setXXX(XXX val) { }
    public void setXXX2(XXX val, XXX val2) { }

    public string GetParameterType(object val) {
        return val.GetType().Name;
    }
} 

Затем запустите метод, передав переменную напрямую, а затем переменную, заключенную в скобки.

MsgBox service.GetParameterType(complexClass) ' Returns XXX
MsgBox service.GetParameterType((complexClass)) ' Returns String
...