c# - 将 C# 动态与 COM 对象一起使用会为已实现接口(interface)的记录方法抛出 RuntimeBinderException

标签 c# com alm

我的应用程序需要与一个 COM 对象交互,由于与本文无关的原因,该对象不能作为引用添加到我的项目中。我认为 C# 动态关键字将是完美的解决方案,但在尝试访问我认为准确的记录成员时遇到了 RuntimeBinderException。

为了完整起见,我正在针对 ALM 12.20 的 HP Application Lifecycle Management (ALM) OTA COM 库进行工作,尽管我将在不直接引用这些对象的情况下概括我认为可能发生的情况。

考虑以下 COM 对象的代码结构(为了可读性,使用 C# 语法)

public interface InterfaceA
{
    string PropertyA { get; }
}

public interface InterfaceB
{
    string PropertyB { get; }
}

public class ClassA : InterfaceA
{
    public string PropertyA { get; }
}

public class ClassB : ClassA, InterfaceB
{
    public string PropertyB { get; }
}

这是返回我需要使用的对象的对象方法的基本签名:

public InterfaceA ReturnObject()
{
    // Returns object that implements InterfaceA and also InterfaceB
    var myClassB = new ClassB();
    return myClassB;
}

下面显示了我如何使用这些对象的基础知识(忽略特定语法)

dynamic dynamicClassB = someOtherDynamicObject.ReturnObject();
Debug.WriteLine(dynamicClassB.PropertyA + "; this works");
Debug.WriteLine(dynamicClassB.PropertyB + "; this throws RuntimeBinderException");

我没有编写这个 COM 库,所以我不能完全确定对象和接口(interface)之间的关系,但我相信伪代码准确地反射(reflect)了正在发生的事情。

通常,您必须将 ClassA 显式转换为 ClassB 才能访问 ClassB 对象的属性,但我对 C# dynamic 关键字的理解是,这不是必需的,甚至可能是不可能的。在运行时,动态对象可能被解析为 ClassA 而不是 ClassB 的实例,这可能是由于返回对象的方法的签名(因为它将 ClassA 定义为返回类型)。

我已经成功地为这个库中的许多 COM 对象使用了动态,但是我在使用类的实例(如本例中的 ClassB)的一些方法/属性时遇到了特别的麻烦。

想法/想法/解决方法表示赞赏。我唯一不能做的就是在我的项目中直接引用 COM DLL。提前致谢。

最佳答案

对于我的场景,事实证明我的文档不准确,并且 RuntimeBinderException 是有效的,因为所请求的成员并不像想象的那样出现在 COM 对象上。

关于c# - 将 C# 动态与 COM 对象一起使用会为已实现接口(interface)的记录方法抛出 RuntimeBinderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32810219/

相关文章:

c# - 列出两个日期之间的月份

c# - 使用 signalr 在 asp.net 中存储数据

c# - 使用 StackExchange.Redis 连接到 Azure Redis 缓存时出错

powershell - 使用 powershell 创建 TFS API 发布

jquery - 如何通过 JQuery 登录 ALM

c# - xamarin 表单应用程序链接 - 从 ios 应用程序委托(delegate)打开 PCL View

c++ - AfxOleInit 和 OleInitialize 有什么区别?

COM 组件类实现来自另一个类型库的接口(interface)

c# - 如何比较 Office 互操作对象是否相等?

javascript - 如何使用rest api javascript : automatic login访问hp alm