2009-10-15 5 views
1

Comment créer des instances et des appels aux composants COM qui ont été étendus?Comment utiliser une interface COM versionnée de C#?

J'ai utilisé un composant COM tiers (XRawFile2.dll de Finnigan/Thermo Scientific) pendant de nombreuses années dans une application connexe mass spectrometry écrite en .NET (VB.NET et C# mixtes) pour accéder aux données de spectre brutes. Cela a bien fonctionné. Cependant, ce composant COM a été étendu au moyen de l'héritage d'interface. Exprimé en IDL (en utilisant la OLE/COM Object Viewer extraite en [Oleview.exe]):

interface IXRawfile3 : IXRawfile2 { 
. 
. 

interface IXRawfile2 : IXRawfile { 
. 
. 

interface IXRawfile : IDispatch { 
. 
. 

coclass XRawfile { 
    [default] interface IXRawfile; 
}; 

La pleine extrait IDL for XRawFile2.dll est disponible (page HTML avec < pré >).

Je veux utiliser une fonction disponible dans la nouvelle interface (IXRawfile3),

GetMassListRangeFromScanNum() 

au lieu de

GetMassListFromScanNum() 

dans l'interface d'origine (IXRawfile).

Je n'ai aucun problème à créer une instance de XRawFile et à appeler GetMassListFromScanNum(). Mais je n'arrive pas à le faire fonctionner avec GetMassListRangeFromScanNum(). Par exemple en utilisant GetMassListRangeFromScanNum() pour une instance de XRawFile donne cette compilation erreur:

Error 1 'XRAWFILE2Lib.XRawfile' does not contain a 
    definition for 'GetMassListRangeFromScanNum' and no 
    extension method 'GetMassListRangeFromScanNum' accepting a 
    first argument of type 'XRAWFILE2Lib.XRawfile' could be 
    found (are you missing a using directive or an assembly 
    reference?) 

Le tryout C# source code est également disponible.

Plate-forme: Windows XP 64 bits SP2. Visual Studio 2008. Le fichier interop pour XRawFile2.dll a été créé par Visual Studio 2008 de la manière normale.

Répondre

1

Essayez de jeter votre instance XRawFile à IXRawfile3

par exemple

((IXRawfile3) myRawFile).GetMassListRangeFromScanNum() 

Cela devrait faire une interface d'interrogation sur l'objet COM, lui demandant de l'interface IXRawfile3. (En supposant que le typelib vous avez importé ne correspond à la mise en œuvre de XRawfile)

+0

Cela a réellement fonctionné. Merci! Les points de données retournés étaient également comme prévu. –

0

Je suggère d'utiliser la déclaration suivante (pour la version 2.2):

MSFileReader_XRawfile rawfile = new MSFileReader_XRawfile(); 

Cela pourrait simplement vous donner une intense.

Vous pouvez appeler l'une des méthodes plus tard.