c# - 如何在不产生异常的情况下检查 COM 属性或方法是否存在?

标签 c# com .net-3.5

我正在处理一些遗留代码,这些代码创建包含属性和/或方法名称的字符串列表,然后尝试将这些属性或方法应用到 COM 对象。不保证 COM 对象的属性或方法存在,它可能是属性或方法,我不知道是哪个。

目前,如果一个属性或方法不存在,它会作为 COM 异常被捕获。这会导致性能不佳。我试图找到一种方法来检查 COM 对象中是否存在属性或方法而不产生异常,以便我可以在尝试应用它之前检查它是否存在。

使用 GetType 返回类型 System.com_object。在 System.com_object 上使用 GetProperty 不起作用,因为这是确切的运行时类型,而不是它的派生类型。相反,我必须调用 InvokeMember,如果该成员不存在,它会创建一个异常。有没有人有更好的方法来做到这一点?

我目前在 .NET 3.5 中工作。迁移到 .NET 4 目前不是一个选项,但如果新语言功能提供更好的解决问题的方法,我仍然对 .NET 4 中的解决方案感兴趣。

public static bool CheckIfComPropertyOrMethodExists<T1>(T1 objectToCheck, string propertyOrMethodName)
{
    if (CheckIfComPropertyExists(objectToCheck, propertyOrMethodName) == false & CheckIfComMethodExists(objectToCheck, propertyOrMethodName) == false) {
        return false;
    }
    {
        return true;
    }
}

public static bool CheckIfComPropertyExists<T1>(T1 objectToCheck, string propertyName)
{
    return objectToCheck.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, objectToCheck, null) != null;
}

public static bool CheckIfComMethodExists<T1>(T1 objectToCheck, string methodName)
{
    return objectToCheck.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance) != null;
}

到目前为止有用的文章

How to check whether an object has certain method/property?

Calling a member of IDispatch COM interface from C#

http://msdn.microsoft.com/en-us/library/aa909091.aspx

Implementing IDispatch in c#

http://msdn.microsoft.com/en-us/magazine/dd347981.aspx

http://blogs.msdn.com/b/lucian/archive/2008/10/06/reflection-on-com-objects.aspx

最佳答案

很可能 COM 类也实现了 IDispatch 接口(interface)。然后,您可以使用它的 GetIDsOfNames 检查类中是否存在成员。

这里有人用 C# 调用它:

Calling a member of IDispatch COM interface from C#

关于c# - 如何在不产生异常的情况下检查 COM 属性或方法是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11540553/

相关文章:

c# - CSharp 命名空间中的 RuntimeBinderException 是否表示 DLR 语言依赖?

c# - 在应用程序启动时禁用 Windows 服务

c# - 所有 C# 强制转换都会导致装箱/拆箱

c++ - native 代码中的托管 dll(通过 com)。它是在 com 服务器进程中还是进程外?

c++ - CreateWICTextureFromFile 返回 E_NOINTERFACE

c# - 多线程批处理队列

c# - 在 c# 中,当向方法发送参数时,我们应该什么时候使用 "ref"什么时候使用 "out"以及什么时候不使用它们?

python - 我如何与 Windows 程序交互

c# - 条件编译和框架目标

c# - 如何扩展 .Net 中的内置配置提供程序以添加自定义存储?