是否可以将System .__ ComObject强制转换为某种类型,只有在运行时才知道?
我有以下代码
Type ComClassType = SomeDLLAssembly.GetType("ClassName");
dynamic comClassInstance = icf2.CreateInstanceLic(null, null, ComClassType.GUID, "License string");
//This will throw exception, because comClassInstance type is __ComObject and it does not contains ComClassMethod
comClassInstance.ComClassMethod();
当我在下面使用代码时,它可以正常工作,但是不幸的是,我不能在代码中使用InvokeMember,因为这会非常复杂。
ComClassType.InvokeMember("ComClassMethod", BindingFlags.InvokeMethod, null, comClassInstance, null);
因此,我想问一下,是否可以将“comClassInstance”强制转换为“ComClassType”,以便能够通过这种方式调用方法comClassInstance.ComClassMethod();。
最佳答案
那至少是问题的一部分。仅当在编译时知道类型时,才可以使用强制类型转换。您不知道,所以您无法编写强制转换表达式。但这还不止于此,您也不知道运行时的类型。 __ComObject
是RCW的低级包装,它存储IDispatch接口(interface)指针。它没有说明您可以调用什么方法以及可以使用哪些属性。
这是较低级别的键入,它是动态键入。通用术语是后期绑定(bind)。这是一种尝试调用并看到与另一位程序员编写的代码交互的方式。 C#团队抵制了很长时间,静态类型是该语言的核心,迫使程序员必须使用Reflection。但是再也没有,由于普遍的需求,他们在v4中添加了dynamic关键字,从而使Visual Basic始终支持C#奇偶校验。现在,您可以使用符号,而无需将字符串传递给Reflection方法,而DLR会自动使用反射来进行调用。否则,完全相同的编程工作就必须知道字符串。
后期绑定(bind)的主要优点是它具有版本控制的灵活性,这是第三方api支持它的基本原因。但这也是它的主要缺点,如果您没有一本好手册或版本更改太多,那么您将获得一个讨厌的运行时异常,该异常只会告诉您“它不起作用”。编译器无法帮助您正确设置它,它不知道类型。 IntelliSense无法帮助您,它无法提供任何自动完成功能。在运行时大吃一惊,找出问题出在哪里的唯一方法是翻阅(遗漏的)手册或与程序员交谈。
许多COM组件都支持早期和晚期绑定(bind)。您需要一个类型库来使用早期绑定(bind),它是组件支持的接口(interface)和共同类的机器可读描述。它与.NET程序集中的元数据完全等效。并发挥相同的作用,使用类型库,编译器现在可以检查您的代码,而IntelliSense可以提供自动完成功能。
类型库通常嵌入在可执行文件(.dll或.exe)中,有时它作为单独的文件提供,.tlb和.olb是常见的扩展名。您可以使用Visual Studio的"file">“打开”>"file"来查看可执行文件,如果类型库是嵌入式的,则会看到TYPELIB节点。然后,您可以使用OleView.exe,"file">“查看Typelib”命令来查看其内容。并运行Tlbimp.exe生成互操作库。
如果找不到类型库并且没有最新的编程手册,那么只有电话可以为您提供帮助。致电组件的所有者或作者以获取帮助。
关于c# - System .__ ComObject的动态强制转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26215023/