2009-10-15 3 views
1

Как сделать экземпляры и вызовы расширенных компонентов COM?Как использовать версированный COM-интерфейс с C#?

Я использовал сторонний компонент COM (XRawFile2.dll от Finnigan/Thermo Scientific) в течение многих лет в связанном приложении mass spectrometry, написанном на .NET (смешанный VB.NET и C#) для доступа к необработанным данным спектра. Это сработало хорошо. Однако этот COM-компонент был расширен с помощью наследования интерфейса. Выраженный в IDL (извлекала с помощью OLE/COM Object Viewer [OLEView.exe]):

interface IXRawfile3 : IXRawfile2 { 
. 
. 

interface IXRawfile2 : IXRawfile { 
. 
. 

interface IXRawfile : IDispatch { 
. 
. 

coclass XRawfile { 
    [default] interface IXRawfile; 
}; 

The полного извлеченного IDL for XRawFile2.dll доступен (HTML страницы с < предварительно >).

Я хочу использовать функцию, доступную в новом интерфейсе (IXRawfile3),

GetMassListRangeFromScanNum() 

вместо

GetMassListFromScanNum() 

в оригинальном интерфейсе (IXRawfile).

У меня нет проблем с созданием экземпляра XRawFile и вызовом GetMassListFromScanNum(). Но я не могу заставить его работать с GetMassListRangeFromScanNum(). Например, используя GetMassListRangeFromScanNum() для экземпляра XRawFile дает эту ошибку компиляции:

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?) 

tryout C# source code также доступна.

Платформа: Windows XP 64 бит SP2. Visual Studio 2008. Файл interop для XRawFile2.dll был создан Visual Studio 2008 обычным способом.

ответ

1

Попробуйте Отдавая свой экземпляр XRawFile к IXRawfile3

например

((IXRawfile3) myRawFile).GetMassListRangeFromScanNum() 

Это должно сделать интерфейс запроса на COM-объекте, запросив его для интерфейса IXRawfile3. (Если предположить, что TypeLib вы импортируемый делает матч реализации XRawfile)

+0

Это действительно сработало. Благодаря! Вернувшиеся точки данных также ожидались. –

0

Я бы предложил использовать следующее заявление (для версии 2.2):

MSFileReader_XRawfile rawfile = new MSFileReader_XRawfile(); 

Это может просто дать вам интенсивное.

Ниже вы можете назвать любой из этих методов.