【问题标题】:How do I use a versioned COM interface from C#?如何使用 C# 中的版本化 COM 接口?
【发布时间】:2020-05-06 20:39:54
【问题描述】:

如何对已扩展的 COM 组件进行实例化和调用?

多年来,我在一个用 .NET(混合 VB.NET 和 C#)编写的mass spectrometry 相关应用程序中使用第三方 COM 组件(来自 Finnigan/Thermo Scientific 的 XrawFile2.dll)来访问原始光谱数据.效果很好。

但是,此 COM 组件已通过接口继承的方式进行了扩展。以 IDL 表示(使用OLE/COM Object Viewer [OleView.Exe] 提取):

interface IXRawfile3 : IXRawfile2 {
.
.

interface IXRawfile2 : IXRawfile {
.
.

interface IXRawfile : IDispatch {
.
.

coclass XRawfile {
    [default] interface IXRawfile;
};

完整提取的IDL for XRawFile2.dll 可用(带有

 的HTML 页面)。

我想使用新界面中可用的功能(IXRawfile3),

GetMassListRangeFromScanNum()

而不是

GetMassListFromScanNum()

在原始界面(IXRawfile)中。

创建 XRawFile 实例并调用 GetMassListFromScanNum() 没有问题。

但我无法让它与 GetMassListRangeFromScanNum() 一起使用。例如,对 XRawFile 的实例使用 GetMassListRangeFromScanNum() 会产生以下编译错误:

    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。XRawFile2.dll 的互操作文件是由 Visual Studio 2008 以正常方式创建的。

【问题讨论】:

    标签: .net com-interop


    【解决方案1】:

    尝试将您的 XRawFile 实例转换为 IXRawfile3

    例如

    ( (IXRawfile3) myRawFile ).GetMassListRangeFromScanNum()
    

    这应该对 COM 对象做一个查询接口,向它询问 IXRawfile3 接口。 (假设你导入的 typelib 确实匹配 XRawfile 的实现)

    【讨论】:

    • 这确实有效。谢谢!返回的数据点也符合预期。
    【解决方案2】:

    我建议使用以下语句(对于 2.2 版):

    MSFileReader_XRawfile rawfile = new MSFileReader_XRawfile();
    

    这只会给你一种强烈的感觉。

    您可以稍后调用任何方法。

    【讨论】:

    • Re “一个强烈的”:你的意思是“一个实例”吗?
    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2022-01-16
    • 2014-04-21
    相关资源
    最近更新 更多