COM-клиент (VBScript), обрабатывающий событие удаленного взаимодействия C # .NET - PullRequest
1 голос
/ 15 марта 2012

Я разрабатываю плагин для существующей программы и пытаюсь добавить интерфейс COM. Чтобы ссылаться на экземпляры различных объектов, которые создаются плагином, плагин также служит сервером удаленного взаимодействия .NET для межпроцессного взаимодействия. Клиентский код .NET Remoting также содержится в той же библиотеке, которая установлена ​​в GAC. (Я понимаю, что WCF заменил .NET Remoting как готовое решение, но по разным причинам WCF на самом деле не подходит.)

Потребитель COM (в моем случае VBScript) создает объект на стороне клиента, который затем получает ссылки на объекты на стороне сервера (MarshalByRefObject). Все это прекрасно работает, и я могу взаимодействовать с объектами, которые взаимодействуют с хост-приложением.

Однако я не могу правильно обрабатывать события на объектах, которые пересекают границу домена приложения.

Я определил следующее:

[ComVisible(false)]
public delegate void TestEventHandler();

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITestEvent
{
    [DispId(5)]
    void OnTestEvent();
}

[ComSourceInterfaces(typeof(ITestEvent))]
[ComVisible(true)]
[ProgId("Zedd.TestEvent")]
public class TestEvent : MarshalByRefObject
{
    public event TestEventHandler OnTestEvent;

    public TestEvent() { }

    public void DoTest()
    {
        if (OnTestEvent != null)
        {
            OnTestEvent.Invoke();
        }
    }
}

[ComVisible(true)]
[ProgId("Zedd.TestEventPassthrough")]
public class TestPassthrough : MarshalByRefObject
{
    public TestPassthrough() { }

    public TestEvent GetTestEvent()
    {
        return new TestEvent();
    }
}

Если я создаю TestPassthrough объект из VBScript, я могу успешно обработать событие:

DIM testPassthrough
DIM testEventObj
SET testPassthrough = CreateObject("Zedd.TestEventPassthrough")
SET testEventObj = testPassthrough.GetTestEvent()
Wscript.ConnectObject testEventObj, "testEventObj_"
testEventObj.DoTest()

SUB testEventObj_OnTestEvent
    Wscript.Echo "Successfully Handled The Event."
END SUB

Я вижу "Успешно обработано событие". как и ожидалось.

Если, однако, я использую .NET Remoting для получения существующей ссылки, я получаю сообщение об ошибке: «WScript.CreateObject: Не удалось подключить объект».

DIM remotingClient
DIM testPassthrough
DIM testEventObj
SET remotingClient = CreateObject("Zedd.TestClient")

' This returns a TestPassthrough object reference, which has crossed the boundary.
SET testPassthrough = remotingClient.TestPassthrough

SET testEventObj = testPassthrough.GetTestEvent()

' This is the line where the error occurs: "WScript.CreateObject: Could not connect object."
WScript.ConnectObject testEventObj, "testEventObj_"

testEventObj.DoTest()

SUB testEventObj_OnTestEvent
    Wscript.Echo "Successfully Handled The Event."
END SUB

Что мне нужно сделать с моим классом TestEvent, чтобы его события были доступны при прохождении границы домена приложения?

...