【问题标题】:How to cast new COM objects from c#如何从 C# 转换新的 COM 对象
【发布时间】:2016-04-23 20:01:32
【问题描述】:

我有一个用 C# (WCF) 制作的 Web 服务,它使用在 Visual Basic 6.0 中制作的 COM 对象。我已经关注this way 来转换 COM 对象并使用我想要的功能。 最大的问题是visual basic .dll 不断变化(因为它正在开发并适应客户端)并且CLSID 不断变化。

这是代码。很简单,我只是投了 COM 并发送打印所有页面:

Printer print = new Printer(); //Where I Cast the COM Library
print.AllPages = 1; //its a parameter but i edited it so you can understand
return print.PrintPdf();

如何使这段代码适应变化?有什么办法可以更改我的代码,这样我就不必删除引用,重新添加它并重建项目?

谢谢

【问题讨论】:

    标签: c# .net wcf com


    【解决方案1】:

    如果 COM-Object 支持后期绑定(如果我没记错的话,默认情况下每个 VB6 COM-Object 都应该支持),您可以在编译时通过 Activator.CreateInstance 创建一个不知道 CLSID 的对象:

    dynamic printer = Activator.CreateInstance(Type.GetTypeFromProgID("SisPrinter.Printer"));
    
    printer.AllPages = 1;
    
    printer.PrintfPdf();
    

    后期绑定比早期绑定慢(通过在 Visual Studio 中添加引用),但甚至允许您调用在此 COM-Object 的更高版本中引入的方法。它的主要目的是支持脚本语言。

    您可以使用 dynamic-Type,而不是针对导入的接口进行编码,该类型自 C# 4.0 起可用。就软件架构而言,这种方法不如添加静态引用好,但在接口稳定之前可能会对您有所帮助。

    【讨论】:

    • 谢谢,我做了类似的事情并且成功了!我不知道激活器
    • 对不起,双重发布,但是“CreateInstance”方法,在注册表的每个文件夹中搜索?还是只是 LocalMachine?
    • 如果在当前用户的上下文中注册了 COM-Object,它应该首先在 HKEY_CURRENT_USER 中查找,如果它没有成功,它将在 HKEY_LOCAL_MACHINE 中查找。
    • 谢谢!你的两个答案对我真的很有帮助!
    猜你喜欢
    • 2012-04-03
    • 2011-05-07
    • 2011-06-07
    • 1970-01-01
    • 2011-08-17
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多