1

我有一个用 C# 编写的基类,它实现了在 IDL 库中定义的接口。我有一个管理此类的单个实例的 C++ 类。我还有一个 C# 项目需要使用这个类[实例(通过 C++ 项目获得)]。我想将我的基类实现的 COM 接口转换回我的 C# 基类。

但是,当我将从 C++ 比例获取的通用对象转换为我的 C# 基类时,我收到了一个错误。当我将它转换为派生接口时,没有问题。

下面是我的问题的类似示例。这两个 if 范围永远不会在 CSDriver 的 NETBaseInstance 函数中进行评估。NETBase 是唯一实现 COMInterface 的类。因此,我确定该值是 NETBase,因为 COMInterface 的 if 范围已被评估。

public class NETBase : COMInterface{ ... }

public class CSDriver{
    private NETBase m_NETBaseInstance;

    ...

    public object NETBaseInstance{
        set{
            COMInterface test;
                if( value is COMInterface ){
                // This is evaluated.
                test = value as COMInterface;
            }

            if( value is NETBase ){
                // This is not evaluated.
                m_NETBaseInstance = value as NETBase;
            }

            if( test is NETBase ){
                // This is not evaluated.
                m_NETBaseInstance = test as NETBase;
            }
        }
    }
}

成功将此 COM 对象转换为 C# 对象的过程是什么?难道我做错了什么?

提前感谢您的任何回答。

4

1 回答 1

1

您无法直接投射它。

非托管 C++ API 返回一个指向COMInterface接口 vtable 的指针;你可能认为你知道 NETBase 是这个接口的唯一实现,但是 .NET COM Interop 基础设施没有这样的知识(确实,严格来说你错了,因为COMInterface非托管代码正在处理的实现是 COM Callable由互操作基础结构创建的包装器,而不是 NETBase 的实例);当您从 C# 调用 C++ API 时,.NET 互操作层所能做的就是将您的托管代码传递给非托管 COM 接口的 Runtime Callable Wrapper,并且此 RCW 不是 的实例NETBase,因此您不能将其转换为NETBase,因为找到。

可能有变通办法来做你想做的事,利用你COMInterface必须指向特定NETBase实例的特殊知识。细节将取决于NETBase(例如,它的状态是否可序列化)的性质以及是否所有托管代码都在同一个 AppDomain 中运行(例如,如果是,您可以在 NETBase 类上提供静态字段和方法以允许与COMInterface指向的实例会合- 如果它真的是一个单例,就像你的问题所暗示的那样是微不足道的)。

于 2012-09-24T10:37:30.073 回答