我有一个供应商特定的COM接口.IntelliSense在编写时显示属性;因此我编写了如下内容

App.Element.Car.seats

这是Visual Studio以某种方式知道的.在AutoComplete窗口中,这些元素显示为属性App,这是外部应用程序的COM接口.Visual Studio是否以某种方式读取了dll/库中可用的方法和属性?

然而,调用返回System.__Object,但它应该是某种类型数字.我没有任何有关COM接口的文档;因此,我只能使用DLL.有没有办法获得正确的类型并以某种方式检索seats中包含的实际值?

在VB中,这种表示法可以工作,但我必须使用C#.

推荐答案

Visual Studio使用元数据为COM对象提供智能感知,这就是它能够在您键入时建议属性和方法的方式.注册COM组件后,类型信息将变为可用,这样像Visual Studio这样的开发环境就可以利用这些信息.

然而,在C#中使用COM互操作时,尤其是在使用后期绑定时,事情可能会变得有点棘手.如果您正在访问的COM对象没有可用的强类型互操作程序集(或者如果您出于某种其他原因而使用后期绑定),则结果通常是一个泛型System.__ComObject,它在C#中不提供太多类型信息.

我建议您使用类型库:如果COM组件附带类型库(.tlb文件),则可以使用Visual Studio附带的tlbimp.exe工具将其导入到C#项目中.这将生成一个.NET互操作程序集,该程序集提供用于与COM组件交互的强类型类.

使用动态:从C#4.0开始,您可以使用Dynamic关键字,它有效地在C#中提供了后期绑定.这使您能够以更类似于VB的方式使用COM对象:

dynamic app = GetComObject(); // 或 however you get your COM object
var seats = app.Element.Car.seats;

Csharp相关问答推荐

react 式扩展连接中的非交叉LeftDurationTimeout

在命令行中使用时安装,但在单击时不会安装

C#使用属性和值将JSON转换为XML

如何从泛型方法返回一个可为空的T,其中T:notnull?

如何在C#中将对象[*,*]直接转换为字符串[*,*]?

将轮询与超时同步

从c#列表中删除额外的对象&对象&>从ASP.NET WebForm返回json响应

我的MRG32k3a算法实现返回的数字超出了预期的[0,1]范围

如果设置了另一个属性,则Newtonsoft JSON忽略属性

如何在Cosmos SDK中控制超时、重试和重试之间的延迟?

Lambda表达式如何与隐式强制转换一起工作?

当try 测试具有协变返回类型的抽象属性时,类似功能引发System.ArgumentException

如何将默认区域性更改为fr-FR而不是en-US?

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

Autofac -动态实例化:手动传递构造函数

如何在.NET Core 8中自定义标识用户模型

WPF:如何从DatagridHeader的内容模板绑定到词典项

无法使用直接URL通过PictureBox.ImageLocation加载图像

外部应用&&的LINQ;左外部连接&类似于PostgreSQL的查询

我应该使用IMhemyCache来存储承载令牌,还是应该为Azure函数中的401个错误实施Polly重试策略?