Полтора дня уже с бубном бегаю (((
Дано: в 1ой сборке описан интерфейс com-объекта,
во 2ой — он реализован.
Всё прекрасно работает, но стоит только добавить ещё один
(в коде закоментирован) евент и всё, ни одного
евента больше не вызываются =0
Отчего это происходит, может у кого есть какие идеи?
1ая сборка:
// Интерфейс со свойствами и методами
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IControl
{
bool Connected { get; }
...
void Connect();
...
}
// Интерфейс с событиями
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IControlEvents
{
#region События
[DispId(0x60020000)] void OnError(EOperation operationID, EErrorCode errorCode, string errorMessage);
[DispId(0x60020001)] void OnControlLoad();
[DispId(0x60020002)] void OnConnected();
[DispId(0x60020003)] void OnDisconnected();
[DispId(0x60020004)] void OnCallMade(int callID, string callingDevice, string calledDevice, string uui);
[DispId(0x60020005)] void OnCallDelivered(int callID);
//[DispId(0x60020006)] void CallHangedUp(int callId, EEventCause cause);
// !!!! если раскоментить, подписки на евенты не происходит,
// то есть во второй сборке проверки типа if(OnConnected != null) дают false
// =( почему?
#endregion
}
#region Типы
public enum EOperation{...}
public enum EErrorCode{...}
public enum EEventCause{...}
#endregion
#region Делегаты
public delegate void ErrorDelegate(EOperation operationID, EErrorCode errorCode, string errorMessage);
public delegate void ControlLoadDelegate();
public delegate void ConnectedDelegate();
public delegate void DisconnectedDelegate();
public delegate void CallMadeDelegate(int callID, string callingDevice, string calledDevice, string uui);
public delegate void CallDeliveredDelegate(int callID);
public delegate void CallHangedUpDelegate(int callId, EEventCause cause);
#endregion
2ая сборка:
[ComVisible(true),
Guid("3B2A046B-174A-36A3-89D3-3EF404E54880"),
ProgId("MyControl"),
ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IControlEvents))]
public partial class Control : UserControl, IControl
{
// Свойства
public bool Connected { get { return _connected; } }
...
// Методы
public void Connect() { if(OnConnected != null) OnConnected(); }
...
// События
private event ErrorDelegate OnError;
private event ControlLoadDelegate OnControlLoad;
private event ConnectedDelegate OnConnected;
private event ConnectedDelegate OnDisconnected;
private event CallMadeDelegate OnCallMade;
private event CallDeliveredDelegate OnCallDelivered;
private event CallHangedUpDelegate CallHangedUp;
...
html-страничка:
<OBJECT id="ctrl" name="ctrl" ClassID="CLSID:3B2A046B-174A-36A3-89D3-3EF404E54880">
</OBJECT>
<script language="javascript">
function ctrl::OnControlLoad()
{
alert("OnControlLoad");
}
function ctrl::OnError(operationID, errorCode, errorMessage)
{
alert("OnError");
}
function ctrl::OnConnected()
{
alert("OnConnected");
}
function ctrl::OnDisconnected()
{
alert("OnDisconnected");
}
function ctrl::OnCallMade(callID, callingDevice, calledDevice, uui)
{
alert("OnCallMade");
}
function ctrl::OnCallDelivered(callID)
{
alert("OnCallDelivered");
}
function ctrl::CallHangedUp(called, cause)
{
alert("CallHangedUp");
}
</script>
<input type=button onClick="javascript:ctrl.Connect();" value="Connect">