Domanda

recentemente ho riscontrato problemi con l'esposizione di eventi da .NET a COM.

Ho avuto successo con questo esempio (tratto concettualmente da http://blogs.msdn.com/andreww/archive/2008/10/13/exposing-events-from-managed-add-in-objects.aspx ):

// Il tipo delegato per il nostro evento personalizzato.

[ComVisible(false)]
public delegate void SomeEventHandler(object sender, EventArgs e);

// Outgoing (source/event) interface.
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IAddInEvents
{
    [DispId(1)]
    void SomeEvent(object sender, EventArgs e);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IAddInEvents))]
public class AddInUtilities :
{       
    // Event field. This is what a COM client will hook up
    // their sink to.
    public event SomeEventHandler SomeEvent;

    inernal void FireEvent(object sender, EventArgs e)
    {
        if (SomeEvent != null)
        {
            SomeEvent(sender, e);
        }
    }
}

Funziona bene, perché l'interfaccia IAddInEvents è definita come IDispatch . Tuttavia, devo pubblicare un'interfaccia di origine evento che è IUnknown . Non ho il controllo dell'interfaccia dell'evento poiché proviene da una libreria di terze parti (che sarà anche il consumatore degli eventi pubblicati). Ogni volta che provo a collegarmi agli eventi, l'ambiente VB (dove sto cercando di affondare gli eventi) si arresta in modo anomalo, così come l'ambiente VBA utilizzato dal prodotto di terze parti (ESRI ArcMap).

Sono stato in grado di implementare (parzialmente) l'interfaccia IConnectionPointContainer (che COM utilizza in background per gestire gli eventi) manualmente, quindi sono in grado di affondare l'evento e passare all'implementazione di IConnectionPointContainer. Tuttavia, questo mi sembra eccessivo e penso che ci debba essere un supporto implicito in .NET. In secondo luogo, con questo approccio perdo immediatamente il supporto delegato.

Qualcuno ha qualche esperienza con questo? Grazie in anticipo.

È stato utile?

Soluzione 2

Ok, quindi sono stato in grado di farlo implementando i classici COM IConnectionPointCointainer, IConnectionPoint e IConnection (oltre alle interfacce di enumerazione). Non si integra nel modello di delegato / evento .NET, ma funziona.

Altri suggerimenti

Molto semplicemente, non sarai in grado di farlo. Classic VB non supporta COM non di automazione (come hai visto).

Dovrai disporre di un wrapper per il passaggio dell'istanza di automazione a cui pubblicherà l'evento non di automazione. Dovrai effettivamente avere due tipi separati per gestire i due client separati per gli eventi (abilitato per l'automazione e non abilitato per l'automazione).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top