如何使.NET COM包装器通用

时间:2010-08-05 22:37:54

标签: c# .net-3.5 interop com-interop installshield

我认为这是一个工厂/提供商类型的故事,但我不知道如何描述我的问题。它是这样的。

InstallShield有一个COM自动化接口,可以在每个版本中更改它的名称。如果是VBScript我会说

set project = CreateObject("ISWiAuto15.ISWiProject) ' InstallShield 2009
set project = CreateObject("ISWiAuto16.ISWiProject) ' InstallShield 2010

一旦我有了项目对象,我就可以做

之类的事情
project.OpenProject( filePath, readOnly )

在C#.NET 3.5中,我添加了我的COM引用并执行相同的操作,除非现在我与该类紧密耦合。我希望能够做类似

的事情
var project = CreateProjectObject( typeof ISWiAutoXX.ISWiProject )

但我无法弄清楚如何执行此操作,因为似乎没有任何共享接口可以使用。

我运气不好还是有办法处理这类问题?

5 个答案:

答案 0 :(得分:4)

如果您只使用.NET 3.5,最好的选择可能是编写自己的接口,公开您需要的确切功能,然后使用IS 2009和IS 2010实现接口。这允许您使用任何在内部实现,并创建工厂方法(或使用DI)来构造对象。

不幸的是,这确实需要相当多的简单传递(只调用COM对象的包装器方法)。但是,它是一种非常强大,面向未来的操作方式,并允许您使用简单的,类型安全的API。

答案 1 :(得分:1)

如果您如此倾向,可以自定义运行时可调用包装器,以便类型名称保持不变

答案 2 :(得分:1)

如果您愿意放弃类型安全,dynamic会有所帮助,但您说它无法使用。

但是,通过使用a simple helper class to hide the noise of reflection,您可以在该语言的旧版本中非常接近dynamic。它不会执行dynamic关键字可以执行的所有操作,但它仍可能适用于您。

答案 3 :(得分:0)

围绕这个问题思考我认为我看到一种可能的解决方案以不同的方式完成,但它有点深奥。

引用是ItemGroup中msbuild(项目)文件的一部分。您可以通过在proj文件中包含的项目中的另一个msbuild文件中具有此特定引用来将此外部化。

最后,您可以根据查找COM接口的某些逻辑生成此外部MSBUILD文件T4,并确定引用包含的内容。

答案 4 :(得分:0)

使用VB.NET创建强类型包装器。然后,您可以从C#应用程序中调用该包装器。