【问题标题】:COM Interop Using Generic Types使用泛型类型的 COM 互操作
【发布时间】:2009-08-14 13:03:46
【问题描述】:

看来您不能直接在 COM 中使用泛型类型:请参阅 MSDN 上的 Interoperating Using Generic Types。

谁能举例说明如何做到这一点?

【问题讨论】:

  • 您能详细说明一下吗?你说不能做,然后问怎么做。你有具体的场景吗?
  • 引用的文章说 'directlty' ,所以我认为有一些方法可以“间接”使用它们。具体例子是这个:stackoverflow.com/questions/1200576/…
  • 只是为了添加更多信息,VB.NET 必须在引用代码工作时执行“间接”操作。如果我拼错了 Controls 集合,我会收到错误:System.MissingMemberException'发生在 Microsoft.VisualBasic.dll 所以,我需要知道丢失的东西是什么,才能让代码在 c# 中运行!

标签: c# com interop


【解决方案1】:

我认为这个想法是您不能直接将泛型类型标记为ComVisible,但您可以让该类型实现ComVisible 的非泛型接口。

所以,给定一个通用的Baker<Recipe>,你需要引入类似的东西:

[ComVisible(true)]
public interface IBake
{
   Pastry Bake();
}

public class Baker<Recipe> : IBake
{
   public Baker(Recipe ingredients) {...}

   public Pastry Bake()
   {
      ...
   }
}

[ComVisible(true)]
public class Bakery
{
   public IBake GetBaker(string recipe)
   {
      // somehow get recipe type from string
      // and create and return Baker<Recipe>
      // Client can now call IBake.Bake().
   }
}

我想这是文章所说的“间接”。我不太明白 VB.NET 的 Controls 集合与此有什么关系,但是...

【讨论】:

  • 我认为这实际上是一个错误(我不知道在使用泛型类型时是与.net framework 还是COM Interop。解释(使用vb.net):如果我允许VB。 NET 来确定“通用”设计器对象的对象类型,它正确地确定它是一个用户表单(我通过返回类型:Microsoft.VisualBasic.Information.TypeName 知道这一点)。如果我明确地将通用对象设置为一个用户窗体,我收到一个错误(使用任何 .NET 语言):{“服务器抛出异常。(来自 HRESULT 的异常:0x80010105(RPC_E_SERVERFAULT))”}
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多