У меня есть сборка .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.