.net - 托管 COM 聚合

标签 .net .net-3.5 com aggregation

我的理解是构建一个聚合现有 COM 对象的 COM 对象意味着在外部对象的 IUnknown.QueryInterface 方法中实现重定向逻辑。

我的问题是,如果您正在构建的对象是受管理的,如何做到这一点。在托管对象上,IUnknown 未明确实现 COM Interop 为您完成。那么如何告诉 COM Interop 我构建的对象是另一个 COM 对象的聚合呢?

到目前为止,我发现的唯一方法是在外部实现内部对象的所有接口(interface)并显式重定向它们。这是a)丑陋和b)假设您知道要实现的所有接口(interface),但在我的情况下并非如此。

有什么想法吗?

最佳答案

如果您使用的是 .NET 4,那么您可以使用 ICustomQueryInterface覆盖默认值 IUnknown.QueryInterface逻辑。
有一个sample for COM aggregation在 CodePlex 上 - 实现非常简单:

CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out IntPtr ppv)
{
    if(iid.Equals(new Guid("00000000-0000-0000-0000-000000001234")))
    {
        ppv = Marshal.GetComInterfaceForObject(this.innerObject, typeof(IInnerInterface), CustomQueryInterfaceMode.Ignore);
        return CustomQueryInterfaceResult.Handled;
    }
    ppv = IntPtr.Zero;
    return CustomQueryInterfaceResult.NotHandled;
}

关于.net - 托管 COM 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1981013/

相关文章:

c# - ShowInTaskbar=true 让我的表单消失

c# - 为什么 SafeHandle.DangerousGetHandle() "Dangerous"?

java - Java 中的 Com 对象,可能吗?

c# - 在 C# COM 项目中,我应该引用 DLL 还是 TLB? (主要是 SolidWorks)

.net - 使用 Expression<Func<object>> 作为字典中的键

c# - 您对异常消息使用什么样式?

c# - .NET 3.5 WinForms - DataGridView 在刷新()时崩溃。这是一个错误吗?

c# - 数据网格到 CSV 文件

c++ - 仅使用 IDL 文件注册 COM 对象

.net - 在 Visual Studio 中创建 Apache Cordova 项目时出错