COM Interop und C#



  • Hallo Community,

    ich hab ein programmtechnisches Problem, das mich nun den ganzen Morgen schon beschäftigt.
    Eigentliches Ziel ist es, eine ActiveX Komponente, mit C#, zu erstellen die dann, und hier hakt es, aus einem Visual Basic Projekt verwendet werden soll.

    Wie das Ganze grundlegend funktioniert ist klar. Nun besteht aber u.A. die Anforderung auf Ereignisse reagieren zu können. Drum hab ich im Moment folgendes (gekürzt):

    [Guid( Guids.IConnectionListenerGUID )]
    [InterfaceType( ComInterfaceType.InterfaceIsIDispatch )]
    [ComVisible( true )]
    public interface IConnectionListener
    {
      [DispId( 1 )] bool StartListen( string ip, int port );
      [DispId( 2 )] void StopListen();
      [DispId( 3 )] bool IsListening { get; }
    }
    
    [Guid( Guids.IConnectionListenerEventGUID )]
    [InterfaceType( ComInterfaceType.InterfaceIsIDispatch )]
    [ComVisible( true )]
    public interface IConnectionListenerEvent
    {
      [PreserveSig, MethodImpl( MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId( 1 )]
      void OnNewConnection( [In, Out, MarshalAs( UnmanagedType.Struct )] ref object arg );
    }
    
    [Guid( Guids.ConnectionListener  )]
    [ComSourceInterfaces( typeof( IConnectionListenerEvent ) )]
    [ClassInterface( ClassInterfaceType.None )]
    [ProgId( "progid.ConnectionListener" )]
    [ComVisible( true )]
    public class ConnectionListener : IConnectionListener
    {
      public event VoidHandler< object > OnNewConnection;
    
      private TcpIpListener mListener;
      // ...
    
      private void mListener_NewConnection(object sender, EventArgs<TcpIpSocket> e)
      {
          // ...
    
          if ( e.Value != null )
            RaiseOnNewConnection( ServiceProviderWrapper.Create( e.Value, this ) );
      }
    
      private void RaiseOnNewConnection( ServiceProviderWrapper sp )
      {
        if ( OnNewConnection != null )
          OnNewConnection( sp );
      }
    
      #region IConnectionListener Members
    
      // ... 
    
      #endregion
    }
    

    Das Assembly auch korrekt registriert etcpp... Allerdings bekomm ich beim einbinden in das Testprojekt eine mysteriöse Fehlermeldung...

    Option Explicit
    
    Private WithEvents mListener As mdServiceProviderWrapper.ConnectionListener
    
    ' ...
    
    Private Sub Form_Load()
        Set mListener = New mdServiceProviderWrapper.ConnectionListener
    End Sub
    
    Private Sub mListener_OnNewConnection(ByRef arg As Variant)
        Log "foo"
    End Sub
    

    ... nämlich: Object or class does not support the set of events" für die Zeile:

    Set mListener = New mdServiceProviderWrapper.ConnectionListener
    

    Bis jetzt ist mir noch kein Licht aufgegangen, wo das Problem liegen könnte. Vielleicht weiß ja jemand was!

    Grüße



  • Zur Info: Hab das Problem soeben gefunden!



  • Magst Du uns denn auch sagen was das Problem war damit andere, die auch nach so einem Problem suchen und Deinen Beitrag finden auch die dazu passenden Tips haben ?



  • Knuddlbaer schrieb:

    Magst Du uns denn auch sagen was das Problem war damit andere, die auch nach so einem Problem suchen und Deinen Beitrag finden auch die dazu passenden Tips haben ?

    Ja, natürlich! Das Problem war das verwendete generische delegate für den Event:

    public event VoidHandler< object > OnNewConnection;
    

Anmelden zum Antworten