我一直在玩COM / NET一段时间了,我很好奇公共语言运行库是否允许你挂钩/覆盖IUnknown :: QueryInterface,这样当使用特定的IID调用QueryInterface时,它将以不同的方式工作比默认。
实现这一目标的一种方法是
创建一个项目DummyGreeter,其中Greeter.vb为comvisible但未以任何语言导出为COM interop。
使用main.cpp,DummyWrapper.def(导出DllGetClassObject,DllCanUnloadNow)创建一个DummyWrapper项目,使用DllGetClassObject公开从IClassFactory派生的纯C ++类,该类创建一个从内部创建的IDispatch派生的纯C ++类实例我的DummyGreeter,每当调用QueryInterface时,它会检查我的特殊IID,如果是,则将ppv设置为我的特殊值,否则,调用DummyGreeter的查询界面。
我想知道是否有办法直接通过
做这样的事情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调用。