Как отладить «Неверное количество аргументов или неверное присвоение свойства» vbscript .NET Interop - PullRequest
3 голосов
/ 20 июля 2009

У меня есть сборка .NET, написанная на C #. Он помечен как ComVisible, имеет guid, подписан, regasm'd (/ codebase). Я не определял формально интерфейс для COM-части.

Я использую эту сборку через VBscript.

Есть перегруженный метод - одна форма принимает один строковый аргумент, а вторая - две строки. Оба возвращают другой тип .NET из той же сборки. Я называю это так:

set foo = WScript.CreateObject("Prog.Id")
' the following succeeds
set bar = foo.Method1("string")
' the following fails
set baz = foo.Method1("string1", "string2")

Первый вызов метода Method1 выполнен успешно. Второй терпит неудачу с Msgstr "Неверное количество аргументов или неверное присвоение свойства".

Как я могу отладить это?

В тестировании, если я определю простой класс .NET с мертвыми мозгами с подобными перегрузками, я могу вызвать его из VBScript, без проблем. Есть что-то еще в моей «настоящей» сборке, которая приводит к сбою. Как мне понять, что это такое?

Ответы [ 2 ]

4 голосов
/ 20 июля 2009

Я не уверен, действительно ли это так, но кажется, что COM не допускает перегрузки методов: здесь или здесь

Первые ссылки, кажется, предполагают, что может быть способ обойти это (с явным определением интерфейса и атрибутами, возможно?), Но я сомневаюсь в этом.

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

2 голосов
/ 08 марта 2011

Подробнее об этом: хотя COM не «разрешает» перегрузку методов, CCW, сгенерированный для класса .NET, использующего перегруженные методы, будет раскрывать все перегрузки. Другими словами, среда на основе COM, такая как VBScript, сможет получить доступ ко всем перегрузкам в классе .NET. Некоторые из перегрузок получают искаженные имена.

Предположим, есть класс, который предоставляет три метода с именем Extract(). Первая перегрузка называется Extract(). Остальные названы суффиксами _2 и _3.

Что определяет, какая перегрузка является "первой" перегрузкой, а какая получает искаженные имена? Я не знаю. Это может быть порядок появления методов в сборке. Но что определяет этот порядок? И здесь я не знаю.

Единственный известный мне способ точно определить, какая именно перегрузка, это просмотреть CCW в OleView.

...