2013-03-27 35 views
3

我需要从C#应用程序连接到PDFCreator COM interface。为此,我使用VS生成的Interop包装器。但是一些客户端有不同版本的PDFCreator(我有1.2.1,一些有1.4.3),如果我使用为1.2.1生成的Interop,我在使用包装时会得到异常。有没有办法解决?所以我的应用程序可以支持多种版本的PDFCreator?PDFCreator与不同版本的COM互操作

此外,我不确定wheather PDFCreator接口是否真的发生了变化。对COM对象的确切版本没有一些锁定,我可以在生成Interop库时简单地关闭它?谢谢。

回答

0

如果你不害怕使用VB.Net而不是C#,你可以尝试使用旧的VB后期绑定功能与PDFCreator的progid。

创建一个新的实例是这样的代码:

Dim myObj As Object 
myObj = CreateObject("PDFCreator.clsPDFCreator") 

然后你就可以调用myObj方法有以下缺点:智能感知将无法正常工作和VB.Net编译器不会提高,如果任何错误你调用一个不存在的方法或者如果你使用了错误的参数。

免责声明:我没有测试过这一点,风险自担

+0

所以,你基本上是说,VB以某种方式(我会进一步研究)可以绑定不同版本的COM,如果他们共享共同的祖先接口,并且C#不能?为什么?顺便说一句,我已经看到了VB应用程序,实际上与不同的PDF Creator版本一起工作,并不知道如何... – 2013-03-27 21:04:22

+1

好吧,所以我做了研究,你的答案踢我在一个确切的方向!自.NET 4.0起,就像VB一样支持后期绑定。更多在我的答案如下:) – 2013-03-27 21:53:36

7

因此,基于YMS答案,我在正确的方向:)有使用它

.NET 4.0支持后期绑定COM物体类似于VB,使用System.Type和魔术dynamic关键字。

简单的例子如何使用运行PDFCreator的动态绑定:

System.Type pdfCreatorType = System.Type.GetTypeFromProgID("PDFCreator.clsPDFCreator"); 
    dynamic comPdfCreator = System.Activator.CreateInstance(pdfCreatorType); 

    comPdfCreator.cStart("", true); 

这个工程就像一个魅力,你鸵鸟政策需要重新编译互操作程序集为每个新的PDFCreator版本。

+1

我只是想让你知道,我已经无数次使用你的解决方案(而不是我的基于VB6的旧方法)后,你张贴它。十分感谢。 – yms 2013-10-29 19:41:28

+1

谢谢,这真的让我的一天:) – 2013-11-07 23:16:11