Подпись метода COM-взаимодействия с ByRef
У меня есть программа на C#, которая вызывает COM DLL, которая имеет метод с именем test
с двумя параметрами: передается первый параметр ByVal
второй пройден ByRef
,
Вот что делает COM DLL:
Public Sub test(ByVal a As String, ByRef b As String)
a = "a"
b = "b"
End Sub
Вот что делает программа C#:
test.Class1 x = new test.Class1();
string a = "1";
string b = "2";
x.test(a, ref b);
Я замечаю, что если я удалю ref
Ключевое слово, компилятор не советует мне, что я пропустил ref
Ключевое слово и передает параметр ByVal
, Это может быть большой проблемой, если я скучаю по ref
Ключевое слово, потому что я не могу заметить это, пока я не знаю, что он хочет ref
, Знаете ли вы, почему компилятор демонстрирует такое поведение?
1 ответ
Это очень специфично для кода взаимодействия COM и языка C# версии 4 и выше. Да, это позволяет опускать ref
в этом конкретном случае. В C# версии 4 было много настроек, облегчающих программирование Office. API-интерфейсы Office изначально предназначались для работы с ранними версиями VB, по умолчанию они использовали ByRef. Тем не менее дело для VBA. Таким образом, API имеет много параметров метода, которые являются ByRef, даже если они на самом деле не изменяют переданный аргумент.
Компилятор сгенерирует временную переменную, если необходимо сделать вызов легальным. В результате ваша переменная не обновляется. Что-то, за чем вы должны следить. Два шага вперед, один шаг назад:)