Domanda

Ho un oggetto COM che si ha bisogno di prendere un flusso da un client e processi IT C #. Sembrerebbe che dovrei usare IStream. Così scrivo il mio IDL come qui di seguito. Poi io uso sugli istituti di compilare un TLB, e compilare la mia soluzione, registrarlo, e quindi aggiungere un riferimento alla mia biblioteca a un progetto C #.

Visual Studio crea una definizione di IStream nella mia libreria. Come posso impedire che farlo, e farlo utilizzare il COMTypes IStream? Sembra che ci sarebbe uno dei 3 risposte: aggiungere un po 'di importazione

  • per l'IDL in modo che non ridichiarare IStream (importazione mscoree lo fa, ma non risolve il problema C #)
  • in qualche modo alias l'IStream in Visual Studio - ma non vedo come fare questo.
  • Tutto il mio pensiero I S completamente sbagliato e non dovrebbe usare IStream a tutti

aiuto ... grazie

[
  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;
  };

};
È stato utile?

Soluzione

Questo non ha bisogno di fissaggio, l'involucro di interoperabilità creato dalla libreria dei tipi andrà bene. La dichiarazione ComTypes.IStream è lì per consentire codice gestito per implementare un server COM che implementa un istream o prende uno come argomento. Un sacco di NET classi del framework fanno.

Altri suggerimenti

Quello che state vedendo e vivendo è una caratteristica (uno spesso fastidioso) del compilatore MIDL. Qualsiasi tipo che viene fatto riferimento all'interno della sezione "libreria" avrà la sua definizione iniettato nel TLB (tipo di libreria); con l'eccezione dell'interfaccia IUnknown e la tipi di base sugli istituti , (e forse un paio di tipi più primitivi). Tali metodi strani che state vedendo sul "tuo" IStream sono provenienti dal tipo di base, ISequentialStream. Hai alcune opzioni:

  1. Wrestle con il compilatore MIDL per giorni per cercare di ottenere da iniettare IStream (e tutti gli altri tipi di supporto). Ho fatto questo. E 'stato anche con Mscoree. Il problema è che il compilatore MIDL importa automaticamente "oaidl.idl" quando incontra una dichiarazione biblioteca. Così quei tipi (Stream e simili) sono già iniettato nel contesto IDL corrente prima di avere la possibilità di fare qualcosa al riguardo. Questa è una caratteristica poco documentato. Linea di fondo è la sua intenzione di farlo, non importa quello che fai, a meno che non si rimuovono i riferimenti difficili da IStream (uso PVOID [*] stream).

  2. ignorarlo. Non usarlo anche. Usa System.Runtime.InteropServices.ComTypes.IStream invece. Finché l'interfaccia in uso (in Net) è segnato con gli attributi corretti (GUID, InterfaceType, ecc), sono intercambiabili. Dovrete o modificare la libreria di tipo o il codice di interoperabilità in modo da accettare che tipo si desidera passare. Mi piacerebbe andare con oggetto in modo da poter utilizzare qualsiasi interfaccia IStream (con una definizione valida). E inoltre non utilizzare lo strumento vecchio TlbImp. Utilizzare la nuova TlbImp2 (scritto in C # e open source) https://clrinterop.codeplex.com/releases / view / 17579 . Esso consente di personalizzare davvero la conversione da TLB a Gestito e si può avere la produzione di file di origine invece di / in aggiunta ad un compilato interoperabilità dll.

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