【问题标题】:How to make a .NET COM wrapper generic如何使 .NET COM 包装器通用
【发布时间】:2010-08-05 22:37:53
【问题描述】:

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

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 )

但我不知道如何执行此操作,因为似乎没有任何共享接口可供投射。

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

【问题讨论】:

  • 在 .NET 4 中,有 dynamic,但在 3.5 上,我相信你搞砸了。
  • 我担心你会这么说。我只是构建自动化框架的一小部分,我不打算在短期内使用 .NET 4。

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


【解决方案1】:

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

不幸的是,这确实需要相当多的简单传递(仅调用 COM 对象的包装器方法)。但是,它是一种非常健壮、面向未来的操作方式,让您可以使用简单、类型安全的 API。

【讨论】:

  • 这对于我的经验水平来说可能是一个不错的选择。您知道根据 COM 包装器中的类型生成接口的任何方法吗?然后我可以创建我的两个类并实现接口并开始连接我关心的成员。
  • @Christopher:我个人会手写它 - 这比自动化解决方案要多一些工作,但有一些优势。只需实现您实际将要使用的方法和属性,并适当地包装它们。 (另一个不错的优势是您可以根据自己的使用情况命名事物,这通常很有帮助,尤其是在使用 COM 时...)
  • 我将给你答案,因为在编写了几个接口和子类之后,我越来越深入我的代码。但是哇,因为我要包装的 API 的复杂性,这需要做很多工作。我不得不承认,这是一个很好的练习,但我放弃了。我打破了一些鸭带:克隆了与 InstallShield 互操作的类文件,并进行了搜索和替换以制作一个 Class15 和一个 Class16。在父类中,我将它包装在一个大的 switch 语句中,这样只有一个类被构造和调用。
  • 我承认,这很丑,我现在必须知道总是修复一个类,然后复制并转换到另一个类,但这段代码在 6 个月内没有改变所以希望这是我最好的投资回报率,尽管涉及多少鸭带。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    但您可以通过使用a simple helper class to hide the noise of reflection 在旧版本的语言中非常接近dynamic。它不能完成 dynamic 关键字可以完成的所有工作,但它仍然可能对您有用。

    【讨论】:

      【解决方案4】:

      考虑到这个问题,我认为我看到了一个可能的解决方案,但它有点深奥。

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-10
          • 1970-01-01
          • 2015-07-24
          • 2010-09-15
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 2018-03-12
          相关资源
          最近更新 更多