Играя си с COM/NET от известно време и съм любопитен дали времето за изпълнение на общ език ви позволява да закачите/замените IUnknown::QueryInterface, така че когато QueryInterface се извика с конкретен IID, той да работи по различен начин от стандартния.
Един от начините за постигане на това е чрез
създаване на проект DummyGreeter с Greeter.vb като съвместим, но не експортиран за COM взаимодействие на който и да е език.
създайте проект DummyWrapper с main.cpp, DummyWrapper.def(експортиране на DllGetClassObject, DllCanUnloadNow), с DllGetClassObject, излагащ чист C++ клас, извлечен от IClassFactory, който създава екземпляр на чист C++ клас, извлечен от IDispatch, който вътрешно създава моя 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, така че предполагам, че трябва да има начин за закачане на междинните извиквания на QueryInteface в C# или поне чрез C++CLI.