Доброе время суток.
Вопрос такой: как корректно написать сервер с событиями на C# так чтобы потом из VC++ клиента
получать уведомления через ConnectionPointContainer;
Вот пример сервера :
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
using System.Reflection;
using opccomn; //Содержит интерфейс IOPCShutdown с событием ShutdownRequest(string szReason)
namespace OPCCom
{
public delegate void ShutdownRequestDelegate(string szReason);
[Guid("79d00415-c808-48ce-888f-f04f71e535eb"),
ClassInterface(ClassInterfaceType.AutoDual),
ComSourceInterfaces("opccomn.IOPCShutdown, opccomn")]
public class CommonServer : opccomn.IOPCCommon
{
public event ShutdownRequestDelegate ShutdownRequest;
public void GetErrorString(int dwError, out string ppString)
{
ppString = "Hello from Vasya";
if (dwError>100)
{
ShutdownRequest("Слишком большая ошибка > 100");
}
}
}
}
Клиетн на VC++ определяет интерфейс IConnectionPointContainer но ниодной ConnectionPoint там нет.
Подскажите как поправить ситуацию.
> как корректно написать сервер с событиями на C# так чтобы потом из VC++ клиента получать уведомления через ConnectionPointContainer;
Пример из MSDN:
using System;
using System.Runtime.InteropServices;
namespace EventSource
{
public delegate void ClickDelegate(int x, int y);
public delegate void ResizeDelegate();
public delegate void PulseDelegate();
// Step 1: Defines an event sink interface (ButtonEvents) to be
// implemented by the COM sink.
[GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface ButtonEvents
{
void Click(int x, int y);
void Resize();
void Pulse();
}
// Step 2: Connects the event sink interface to a class
// by passing the namespace and event sink interface
// ("EventSource.ButtonEvents, EventSrc").
[b]ComSourceInterfaces[/b](GetType(ButtonEvents))]
public class Button
{
public event ClickDelegate Click;
public event ResizeDelegate Resize;
public event PulseDelegate Pulse;
public Button()
{
}
public void CauseClickEvent(int x, int y)
{
Click(x, y);
}
public void CauseResizeEvent()
{
Resize();
}
public void CausePulse()
{
Pulse();
}
}
}
VC++ клиент должен подключиться к ButtonEvents.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, Varg, Вы писали:
Просьба выделять исходные коды.
... << RSDN@Home 1.1.4 beta 4 rev. 350>>
> Просьба выделять исходные коды.
Я бы с радостью, но как? уже это обсуждалось, см.
http://www.gotdotnet.ru/Forums/SiteDiscuss/113485.aspx
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
А вот так разве не работает:
static void Main()
{
int i = 0;
}
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение