Ошибка «Параметр неверен» при вызове сборки .NET через COM-компонент
-
22-09-2019 - |
Вопрос
У меня есть сборка .NET, которая находится в GAC.Он зарегистрирован правильно, поэтому его могут вызывать компоненты COM.Эта сборка .NET содержит метод и перегрузку метода:
public void Foo(string sValString, out string sOutString, string sOverloadString)
{
if( sOverloadString == string.Empty )
// do something
else
// do something else
}
public void Foo(string sValString, out string sOutString)
{
Foo(sValString, out sOutString, string.Empty);
}
Теперь я могу использовать FoxPro для вызова этой сборки:
o = CREATEOBJECT("FooNamespace.FooClass")
sValString = "blah"
sOutString = "blahblah"
o.Foo(sValString, @sOutString, "") *OK!
o.Foo(sValString, @sOutString) *Generates error
Вызов версии с тремя параметрами работает нормально, но версия с двумя параметрами выдает следующую ошибку при вызове COM-компонента:
OLE error code 0x80070057: The parameter is incorrect.
Есть идеи??Спасибо!
Решение
COM вообще не поддерживает перегрузки методов.Ваша вторая функция Foo() будет переименована, когда Regasm.exe сгенерирует библиотеку типов.Вы можете использовать инструмент Oleview.exe, чтобы просмотреть его, если Foxpro не может сказать вам, какое имя было использовано.
Лучше всего полностью избежать этой проблемы и просто дать перегрузке другое имя, чтобы вам не приходилось ее гадать.
Другие советы
Зачем так быстро бросать.
using System.Runtime.InteropServices;
...
public void Foo(string sValString, out string sOutString, [Optional] string sOverloadString)
И это не функция C# 4.0.