Frage

ich ein COM-Objekt haben, die Bedürfnisse nehmen einen Strom aus einem C # Client und Prozesse es dauert. Es scheint, dass ich IStream verwenden sollte. Also schreibe ich meine IDL wie unten. Dann benutze ich MIDL zu einem TLB zu kompilieren, und meine Lösung kompiliert up, registrieren, und dann einen Verweis auf meine Bibliothek zu einem C # -Projekt hinzuzufügen.

Visual Studio erstellt eine IStream Definition in meiner eigenen Bibliothek. Wie kann ich es zu tun, dass stoppen, und bekommen es die COMTypes IStream zu benutzen? Es scheint, dass es eine von drei Antworten geben würde: fügen Sie einigen Import

  • auf die IDL, damit es nicht neu deklarieren IStream (Import MSCOREE das tut, löst aber nicht das C # Problem)
  • irgendwie alias die IStream in Visual Studio - aber ich sehe nicht, wie dies zu tun.
  • Alle meine Gedanken i ist völlig falsch und ich werden mit IStream nicht bei allen

Hilfe ... Dank

[
  uuid(3AC11584-7F6A-493A-9C90-588560DF8769),
  version(1.0),
]
library TestLibrary
{

  importlib("stdole2.tlb");

  [
    uuid(09FF25EC-6A21-423B-A5FD-BCB691F93C0C),
    version(1.0),
    helpstring("Just for testing"),
    dual,
    nonextensible,
    oleautomation
  ]
  interface ITest: IDispatch
  {
    [id(0x00000006),helpstring("Testing stream")]
    HRESULT _stdcall LoadFromStream([in] IStream * stream, [out, retval] IMyTest ** ResultValue);
  };

  [
    uuid(CC2864E4-55BA-4057-8687-29153BE3E046),
    noncreatable,
    version(1.0)
  ]
  coclass HCTest
  {
     [default] interface ITest;
  };

};
War es hilfreich?

Lösung

Dies gilt nicht Fixierung benötigen, den Wrapper Interop aus der Typenbibliothek erstellt wird in Ordnung sein. Die ComTypes.IStream Erklärung gibt es verwalteten Code zu ermöglichen, einen COM-Server zu implementieren, dass Geräte eine IStream oder eine als Argument übernimmt. Viele .NET Framework-Klassen zu tun.

Andere Tipps

Was Sie sehen und erleben, ist ein Merkmal (oft ärgerlich ein) der MIDL-Compiler. Jede Art, die innerhalb der „Library“ Abschnitt verwiesen wird, wird dessen Definition haben injiziert in den TLB (Typenbibliothek); mit Ausnahme der IUnknown-Schnittstelle und die MIDL Basistypen , (und vielleicht noch ein paar primitive Typen). Diese seltsamen Methoden, die Sie sehen auf „Ihre“ IStream kommt von dem Basistyp, ISequentialStream. Sie haben ein paar Optionen:

  1. Wrestle mit den MIDL-Compiler für Tage, um zu versuchen, es zu bekommen aus einer Injektion IStream (und alle seine anderen Trägertypen). Ich habe dies getan. Es war auch mit Mscoree. Das Problem ist, dass die MIDL-Compiler automatisch Importe „oaidl.idl“, wenn es eine Bibliothek Aussage trifft. Also diese Typen (Stream und so weiter) ist bereits in den aktuellen Kontext IDL injiziert, bevor Sie eine Chance zu tun, etwas dagegen zu haben. Dies ist eine schlecht dokumentierte Funktion. Unterm Strich wird seine, es zu tun, egal was Sie tun, wenn Sie die Fest Verweise auf IStream entfernen (Verwendung PVOID [*] Stream).

  2. ignorieren. Verwenden Sie es nicht einmal. Verwenden System.Runtime.InteropServices.ComTypes.IStream statt. Solange die Schnittstelle, die Sie (in .NET) verwenden, um mit den richtigen Attributen markiert (Guid, Interface, etc.), sind sie austauschbar. Sie werden die Art Bibliothek oder Interop-Code zu jeder bearbeiten haben, so wird es akzeptieren, was geben Sie wollen es passieren. Ich würde mit dem Objekt gehen, so dass Sie jede IStream-Schnittstelle (mit einer gültigen Definition) verwenden können. Und auch nicht verwendet das alte TlbImp Werkzeug. Verwenden Sie die neue TlbImp2 (geschrieben in C # und Open Source) https://clrinterop.codeplex.com/releases / view / 17579 . Es ermöglicht Ihnen, wirklich die Konvertierung von TLB anpassen, um Managed und Sie können es Quelldateien anstelle von / zusätzlich zu einer Interop-DLL kompiliert produzieren.

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