У меня есть сборка .NET 3.5, которая запускается как компонент сервера COM +, и я хочу вызвать метод этого класса из VBScript (классическая страница ASP).
Это схема метода;
public bool FillArray(ref string[] arrayToFill)
{
...
}
Мой VBScript выглядит следующим образом;
Dim myComponent, result, myArray
Set myComponent = Server.CreateObject("MyComponentProgID")
result = myComponent.FillArray(myArray)
Response.Write("IsArray = " & IsArray(myArray) & "<br/>")
Response.Write("UBound = " & UBound(myArray) & "<br/>")
Response.Write("TypeName = " & TypeName(myArray) & "<br/>")
Response.Write("Element 1 = " & myArray(1))
Это приводит к следующей ошибке (вызванной строкой, в которой я вызываю FillArray);
Тип ошибки: среда выполнения Microsoft VBScript (0x800A0005) Недействительный вызов процедуры или аргумент: «FillArray»
При запуске OLEView IDL выглядит следующим образом;
HRESULT FillArray(
[in, out] SAFEARRAY(BSTR)* arrayToFill,
[out, retval] VARIANT_BOOL* pRetVal);
Я попытался изменить подпись моего метода на следующее:
public bool FillArray(ref object[] arrayToFill)
Что привело к следующему IDL;
HRESULT FillArray(
[in, out] SAFEARRAY(VARIANT)* arrayToFill,
[out, retval] VARIANT_BOOL* pRetVal);
Но все та же ошибка «Неверный вызов процедуры или аргумент FillArray».
Наконец, я попытался изменить сигнатуру моего метода на это;
public bool FillArray(ref object arrayToFill)
Что дало следующий IDL;
HRESULT FillArray(
[in, out] VARIANT* arrayToFill,
[out, retval] VARIANT_BOOL* pRetVal);
Теперь это дает новую ошибку;
Среда выполнения Microsoft VBScript (0x800A000D) Несоответствие типов
Эта ошибка теперь запускается только в последней строке, то есть когда я пытаюсь получить доступ к элементу массива. Если я закомментирую последнюю строку, то получу следующий результат:
IsArray = True
UBound = 39
TypeName = String ()
Итак, видимо, вариант распознается как массив и правильного типа. Кроме того, UBound возвращает правильное количество элементов, но я не могу получить доступ ни к одному из элементов по неизвестной причине.
Кто-нибудь знает, что может быть причиной этого? Я сам провел небольшое исследование и наткнулся на следующую ссылку;
http://connect.microsoft.com/VisualStudio/feedback/details/331632/marshaler-bug-with-vbscript-arrays
Я не на 100% уверен, что это та же проблема, поскольку я не объявляю свои массивы таким же образом в моем коде VBScript. Я искренне надеюсь, что это не та же проблема, поскольку у меня нет возможности перейти на .NET 4.0.