【问题标题】:Implementing IUnknown in C#在 C# 中实现 IUnknown
【发布时间】:2013-05-18 21:52:58
【问题描述】:

我一直在寻找如何在 C# 中实现 IUnknown 的示例,但没有找到任何合适的参考或解决方案。

是不是应该这么简单……

public interface IUnknown
{
    UInt32 AddRef();
    UInt32 QueryInterface([In] IntPtr riid, [Out] IntPtr ppvObject);
    UInt32 Release();
}

...或者还有更多内容?

【问题讨论】:

  • AFAIK IUnknown 在 C# 中隐式实现。
  • 你的目标是什么? IUnknown 由 COM 互操作自动实现。你不需要做任何事情。
  • @JordanParmer,我不知道这一点(我现在是:-))。我有一个实现 IUnknown 的接口(C++),所以我不确定如何从 C++ COM 接口继承 IUnnkown(如果这有意义的话)...

标签: c# .net interface iunknown


【解决方案1】:

为什么要实现 IUnknown?那是一个COM接口。如果您想与 COM 互操作,请使用为您实现 IUnknown 的 .Net/COM 桥。

【讨论】:

  • 只是出于兴趣,Direct2D 接口 ID2D1Factory 继承自 IUnknown,所以大概我仍然需要用 .NET 实现这个接口......我不确定我会在这里做什么。
  • 您想要的一个原因是允许您的 COMVisible 类对某些接口引用具有自定义响应。通常 C# 负责 QueryInterface 的所有连接,但有时您可能希望在不手动编写包装器的情况下对特定 IID 进行自定义响应。
  • 这不是答案。如果您不了解问题的可行性,请查询。
  • @ZverevEvgeniy 然而作者接受了它,所以我不可能完全错了。此外,这是一个 7 年前的问题。
【解决方案2】:
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ISomeInterface
{
   ...
}

这个属性做 ISomeInterface : IUnknown { ... }

【讨论】:

    【解决方案3】:

    问的是: { ... 只是出于兴趣,Direct2D 接口 ID2D1Factory 继承自 IUnknown,所以大概我仍然需要用 .NET 实现这个接口......我不确定我会在这里做什么。 – series0ne 2013 年 5 月 24 日 8:51 ... } 答案是否定的。从 IUnknown 派生类的全部意义在于,您的类不必实现 IUknown 为您所做的任何事情。它将自动处理诸如 QueryInterface 和 AddRefCount 之类的事情。你甚至不用 C# 或 C++ 做任何事情。在 C++ 中是 CoCreateInstance(),在 C# 中是 Activator.CreateInstance()。

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多