代码之家  ›  专栏  ›  技术社区  ›  Christopher Painter

如何使.NET COM包装器通用

  •  2
  • Christopher Painter  · 技术社区  · 15 年前

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

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

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

    project.OpenProject( filePath, readOnly )
    

    var project = CreateProjectObject( typeof ISWiAutoXX.ISWiProject )
    

    但我不知道如何做到这一点,因为似乎没有任何共享的接口可以使用。

    我是运气不好还是有办法解决这类问题?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Reed Copsey    15 年前

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

    不幸的是,这确实需要相当多的简单传递(只调用COM对象的包装方法)。但是,它是一种非常健壮、经得起未来考验的操作方式,并允许您使用简单、类型安全的API。

        2
  •  1
  •   Conrad Frix    15 年前

    如果您愿意,可以自定义运行时可调用包装器,使类型名保持不变

        3
  •  1
  •   Daniel Earwicker    15 年前

    如果你愿意放弃类型安全, dynamic

    动态 在旧版本的语言中,使用 a simple helper class to hide the noise of reflection . 它并不是做所有的事情 关键字可以,但它可能仍然适用于您。

        4
  •  0
  •   Preet Sangha    15 年前

    仔细想想这个问题,我想我看到了一个可能的解决办法,但有点深奥。

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

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

        5
  •  0
  •   Jonathan Allen    15 年前

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