.NET:C#/ C ++ CLI可以重载/挂钩IUnknown吗?

时间:2018-04-13 21:40:10

标签: c# .net com c++-cli

我一直在玩COM / NET一段时间了,我很好奇公共语言运行库是否允许你挂钩/覆盖IUnknown :: QueryInterface,这样当使用特定的IID调用QueryInterface时,它将以不同的方式工作比默认。

实现这一目标的一种方法是

  1. 创建一个项目DummyGreeter,其中Greeter.vb为comvisible但未以任何语言导出为COM interop。

  2. 使用main.cpp,DummyWrapper.def(导出DllGetClassObject,DllCanUnloadNow)创建一个DummyWrapper项目,使用DllGetClassObject公开从IClassFactory派生的纯C ++类,该类创建一个从内部创建的IDispatch派生的纯C ++类实例我的DummyGreeter,每当调用QueryInterface时,它会检查我的特殊IID,如果是,则将ppv设置为我的特殊值,否则,调用DummyGreeter的查询界面。

  3. 我想知道是否有办法直接通过

    做这样的事情
    using System;
    using System.Runtime.InteropServices;
    
    [ComVisible(true), Guid("93FA9DCA-45C0-492D-8067-15B580B84135")]
    public class Greeter
    {
        public void Greet() {
            Console.WriteLine("hi");
        }
    
        public void QueryInterface(Guid id, ref object returnValue) {
            if (id == new Guid("97D87EC0-286B-4A5F-83E6-7ACC12579E0B")) {
                returnValue = "yep";
                return;
            }
    
            this.DefaultQueryInterface(id, returnValue);
        }
    }
    

    是可能的,或者你总是需要一个COM包装来做这样的事情。我可以想象它是不可能的,因为理想情况下,.NET对象不应该知道COM,以便它们可以在没有COM的环境中工作,但同时,在Windows平台上,它确实在你做东西时生成COM代码COMVisible,所以我想应该有一种方法可以在C#或至少通过C ++ CLI挂钩中间QueryInteface调用。

0 个答案:

没有答案