c# 您所在的位置:网站首页 system_comobject c#

c#

2023-03-26 10:09| 来源: 网络整理| 查看: 265

是否可以将 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();

最佳答案

which is known only at runtime?

这至少是部分问题。只有在编译时知道类型时才能使用强制转换。你不知道所以你不能写 cast 表达式。但它比这更深,你也不知道运行时的类型。 __ComObject 是 RCW 的低级包装器,它存储 IDispatch 接口(interface)指针。它没有说明您可以调用哪些方法以及可以使用哪些属性。

这是较低级别的打字,它是动态打字。对此的一般术语是后期绑定(bind)。这是一种尝试调用它并查看会发生什么的方式来连接另一个程序员编写的代码。 C# 团队抵制了很长时间,静态类型是语言的核心,迫使程序员使用反射。但仅此而已,根据大众需求,他们在 v4 中添加了 dynamic 关键字,使 C# 与始终支持它的 Visual Basic 具有同等地位。您现在可以使用符号而不是将字符串传递给反射方法,DLR 会自动使用反射来进行调用。否则完全相同的编程工作,你必须知道字符串。

后期绑定(bind)的主要优点是它对版本控制具有弹性,这是第 3 方 api 青睐它的基本原因。但也是它的主要缺点,如果您没有好的手册或版本更改太多,那么您将得到一个令人讨厌的运行时异常,除了“它不起作用”之外什么也没有告诉您。编译器无法帮助您正确处理,它不知道类型。 IntelliSense 无法帮助您,它无法提供任何自动完成功能。只是在运行时发出一声巨响,找出问题所在的唯一方法是仔细阅读(丢失的)手册或与程序员交谈。

许多 COM 组件都支持早期绑定(bind)和后期绑定(bind)。您需要一个类型库 才能使用早期绑定(bind),它是对组件支持的接口(interface)和组件类的机器可读描述。它完全等同于 .NET 程序集中的元数据。并执行相同的角色,使用类型库,编译器现在可以检查您的代码,并且 IntelliSense 可以提供自动完成功能。

类型库通常嵌入在可执行文件(.dll 或.exe)中,有时也作为单独的文件交付,.tlb 和.olb 是常见的扩展名。您可以使用 Visual Studio 的"file">“打开”>"file"查看可执行文件内部,如果嵌入了类型库,您会看到 TYPELIB 节点。然后您可以使用 OleView.exe,File > View Typelib 命令查看其内容。并运行 Tlbimp.exe 生成互操作库。

如果您找不到类型库并且没有像样的最新编程手册,那么只有电话可以帮助您。调用组件的所有者或作者以获取帮助。

关于c# - System.__ComObject 的动态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26215023/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有