Предоставление событий C # COM-сервера клиентским приложениям Delphi - PullRequest
4 голосов
/ 19 мая 2010

Мой вопрос очень похож на эти два:

События C # компонента?

C # - запись COM-сервера - события не запускаются на клиенте

Однако то, что сработало для них, не работает для меня. Файл библиотеки типов не имеет никаких намеков на определения событий, поэтому Delphi его не видит. Как и следовало ожидать, класс отлично работает для других приложений на C #.

Инструменты COM-сервера:

  • Visual Studio 2010
  • .NET 4.0

Приложения Delphi:

  • Delphi 2010
  • Delphi 7

Вот упрощенная версия кода:

 /// <summary>
/// Call has arrived delegate.
/// </summary>
[ComVisible(false)]
public delegate void CallArrived(object sender, string callData);

/// <summary>
/// Interface to expose SimpleAgent events to COM
/// </summary>
[ComVisible(true)]
[GuidAttribute("1FFBFF09-3AF0-4F06-998D-7F4B6CB978DD")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IAgentEvents
{
    ///<summary>
    /// Handles incoming calls from the predictive manager.
    ///</summary>
    ///<param name="sender">The class that initiated this event</param>
    ///<param name="callData">The data associated with the incoming call.</param>
    [DispId(1)]
    void OnCallArrived(object sender, string callData);
}

/// <summary>
/// Represents the agent side of the system. This is usually related to UI interactions.
/// </summary>
[ComVisible(true)]
[GuidAttribute("EF00685F-1C14-4D05-9EFA-538B3137D86C")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IAgentEvents))]
public class SimpleAgent
{
    /// <summary>
    /// Occurs when a call arrives.
    /// </summary>
    public event CallArrived OnCallArrived;

    public SimpleAgent() {}

    public string AgentName { get; set; }

    public string CurrentPhoneNumber { get; set; }

    public void FireOffCall()
    {
        if (OnCallArrived != null)
        {
            OnCallArrived(this, "555-123-4567");
        }
    }
}

Файл библиотеки типов содержит определения свойств и методов, но события не отображаются. Я даже открыл библиотеку типов в средстве просмотра Delphi, чтобы убедиться. Приложение Delphi может прекрасно видеть и использовать любые свойства, методы и функции. Он просто не видит события.

Буду признателен за любые указатели или статьи для чтения.

Спасибо!

1 Ответ

5 голосов
/ 25 мая 2010

Я наконец-то решил эту проблему после долгих проб и ошибок. В коде C # мне нужно было изменить две вещи.

1) [ClassInterface (ClassInterfaceType.None)] необходимо изменить на [ClassInterface (ClassInterfaceType.AutoDual)]

2) Класс, являющийся источником событий, должен наследоваться от MarshalByRefObject. Это помогает, если в исходном классе есть какие-либо потоки.

Мне нужна была только одна вещь на стороне Дельфи. Мне нужно было убедиться, что флажок «Generate Component Wrapper» установлен. Это то, что фактически создаст леса событий на стороне Delphi.

Вот как вы делаете это в Delphi 7:

  1. Выберите из меню Проект -> Импорт библиотеки типов
  2. Убедитесь, что установлен флажок «Создать компонентную оболочку»
  3. Выберите класс COM из списка
  4. Нажмите на кнопку «Добавить юнит»

Новый модуль будет иметь определения ваших событий COM.

Пошаговое сообщение в блоге о том, как это сделать

...