Frage

Das ist nur eine Frage, wie mein Code für einen COM-Import zu schreiben.

Ihr Verständnis für die korrekte Umsetzung der Interop-Schnittstellen ist, dass die wichtigsten Kriterien sind, dass:

  1. Alle Methodensignaturen müssen in einem kompatiblen Art und Weise übereinstimmen
  2. Methoden in genau der gleichen Reihenfolge, in der .NET-Schnittstelle erscheinen müssen, wie sie in der nicht verwalteten Schnittstelle tun
  3. Wenn die nicht verwaltete Schnittstelle von einem anderen nicht verwalteten Schnittstelle erbt, muss die verwaltete Implementierung erklärt zunächst die Schnittstelle Mitglieder auf Basisebene, beginnend mit der Basis am weitesten Schnittstelle.

Meine Frage ist; was muss ich tun, in der in Bezug auf die Reihenfolge der Mitglieder erscheinen, wenn die Schnittstelle I von einer anderen Schnittstelle und überschreibt / versteckt eine oder mehrere der Mitglieder in der Basis-Schnittstelle vererbt wird am Import? Wohin geht die Schnittstelle Mitglied Erklärung? Erstens, wo die Basis-Schnittstelle sie deklariert? Oder von seiner ursprünglichen Position entfernt und wo die abgeleitete Schnittstelle erklärt sie?

[uuid(31d1c294-1dd2-11b2-be3a-c79230dca297)]
interface BaseComInterface
{
    void method1();
    void method2();
    void method3();
}

[uuid(fab51c92-95c3-4468-b317-7de4d7588254)]
interface DerivedComInterface : BaseComInterface
{
    void method1();
    void method4();
    void method5();
}

Jetzt für den C # -Code:

[Guid("fab51c92-95c3-4468-b317-7de4d7588254"), ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IDerivedComInterface
{
    void method1(); // do I remove this one?
    void method2();
    void method3();
    void method1(); // or this one?
    void method4();
    void method5();
}
War es hilfreich?

Lösung

Haben Sie ein Beispiel für jemand dies tatsächlich tun? Während es vollkommen legal in COM ist mit dem gleichen Namen für eine Methode in einer Schnittstelle und in einer anderen Schnittstelle daraus abgeleitet zu haben, macht es mit der abgeleiteten Schnittstelle schwierig oder unmöglich, in so ziemlich alle Entwicklungsumgebungen arbeiten. Dazu gehören sowie Aufruf alle COM-Objekte Implementierung basiert auf der Schnittstelle.

Es gibt nicht so etwas wie zwingenden oder in einer COM-Schnittstelle versteckt. Eine COM-Schnittstelle ist nur ein Vertrag, wie binäre Schnittstelle ist ein Objekt im Speicher angelegt wird, sind die Namen der Methoden in der Schnittstellendefinition sinnlos, außer Werkzeugen. In Ihrem Fall verspricht die BaseComInterface eine ‚V-Tabelle‘ mit sechs Methoden der ersten drei Spielen der Unterschriften der IUnknown-Methoden und die nächsten drei Spielen der Unterschriften der drei Methoden, die Sie gegeben haben, alle in der richtigen Reihenfolge. Auf der anderen Seite DerivedComInterface verspricht eine ‚V-Tabelle‘, die neun Methoden umfassen, wieder die ersten drei Unterschriften, die IUnknown-Methoden entsprechen, die nächsten drei Spiele der Unterschriften der BaseComInterface Methoden und die letzten drei Spiele der drei Methoden eindeutig DerivedComInterface. Die Namen dieser Methoden sind immateriell außer denen in Ihr IDE, Tools und Compiler, der die Namen müssen die ‚VTable‘ Zeiger finden.

Also im Grunde in C # sowie C, C ++ und einigen anderen Sprachen, um DerivedComInterface eine der Methodennamen implementieren müßte eingerichtet werden, zu unterscheiden, es ist ‚VTable‘ Schlitz von den anderen Seite.

Um Ihre Frage zu beantworten - Sie weder Methode entfernen würden, da sie beide erforderlich sind, dort zu sein, den COM-Vertrag zu erfüllen:

[Guid("fab51c92-95c3-4468-b317-7de4d7588254"), ComImport,  InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IDerivedComInterface
{
    void method1(); 
    void method2();
    void method3();
    void method1_2(); //Decorated to distinguish from base interface method.
    void method4();
    void method5();
}

Dies ignoriert, was passieren würde, wenn diese Schnittstellen von IDispatch abgeleitet statt IUnknown, ein Chaos würde ich nicht in zu bekommen. Denken Sie auch daran, dass, wenn Ihr IDL wirklich die Methoden definiert als ungültig zurückkehr Sie Ihre C # Methoden mit dem Attribut PreserveSig dekorieren müssen.

Andere Tipps

Ich schlage vor, Sie verwenden explizite Schnittstellenmember Implementierungen zur Vermeidung von Konflikten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top