VBScript вызывает исключение, когда принимающий объект является C # COM-объектом, а функция имеет интерфейс в качестве параметра - PullRequest
2 голосов
/ 31 мая 2011

Вот мой код VBScript

Set object= CreateObject("Demo. Object")
Set service= CreateObject("Demo.ManageServer ")
service.SetObject object

Я получаю следующее сообщение:

Ошибка : неверный вызов или аргумент процедуры: 'Service.SetObject'Код: 800A005

Демо. Сервис - это C # COM-объект

[ProgId("Demo.ManageServer")]
[Guid("A4F0A0F0-9C0C-4C71-AD58-A36F750D92FE")]
[ComVisible(true)]
public class MyServer :IMyServer
{
    public void SetObject (IMyObject obj) { … }     
}

Интерфейс:

[TypeLibType(TypeLibTypeFlags.FDual | TypeLibTypeFlags.FNonExtensible | TypeLibTypeFlags.FDispatchable)]
[Guid("B3ACBCAD-5ED3-4113-B9D2-FC67FA49012B")]
public interface IMyServer
{
     [DispId(1)]
     void SetObject (IMyObject obj);
}

ПРИМЕЧАНИЕ:

1) Когда я посылаю 'Nothing' в качестве параметра функции, она работает нормально

2) Когда я меняю интерфейс функции для получения объекта, она также работает снова.

Знаете ли вы, почемуиспользуя явный тип в сигнатуре функции, VBScript выдает исключение?

Я уже пробовал, и это не работает.Кроме того, если получателем является C ++ COM-объект, у меня нет проблем с отправкой как Управляющих, так и неуправляемых объектов. Если получателем является C # COM-объект, я могу передать управляющий объект, только если использую скобки

manageServer.PrintType (nativeObject) Без скобок я получаю то же исключение, но в случае, если я пытаюсь отправить в неуправляемый код неуправляемый объект, ничего не поможет

1 Ответ

0 голосов
/ 31 мая 2011

Если вы используете Object, CLR примет ссылку IDispatch, которую передает VBS.Когда вы затем приведете его к типу интерфейса, CLR будет использовать обычный подход QueryInterface.

Вам может повезти, если вы пометите параметр следующим образом:

 [DispId(1)]
 void SetObject ([UnmanagedType.Interface]IMyObject obj);

Это должно сказатьCLR, что он получит что-то совместимое с IUnknown и что он должен попытаться использовать QueryInterface для приведения его к типу вашего интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...