.NET: Може ли C#/C++CLI да претовари/закачи IUnknown?

Играя си с COM/NET от известно време и съм любопитен дали времето за изпълнение на общ език ви позволява да закачите/замените IUnknown::QueryInterface, така че когато QueryInterface се извика с конкретен IID, той да работи по различен начин от стандартния.

Един от начините за постигане на това е чрез

  1. създаване на проект DummyGreeter с Greeter.vb като съвместим, но не експортиран за COM взаимодействие на който и да е език.

  2. създайте проект 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.


person Dmitry    schedule 13.04.2018    source източник
comment
msdn.microsoft.com /en-us/library/   -  person Hans Passant    schedule 14.04.2018
comment
точно това исках! Благодаря!   -  person Dmitry    schedule 14.04.2018
comment
освен това, възможно ли е това за classfactory на обекта? това беше само за самия обект.   -  person Dmitry    schedule 14.04.2018
comment
Вижте отговора тук   -  person minus one    schedule 24.04.2018
comment
трудно разбирам как мога да използвам информацията в тази публикация, за да създам classfactory с претоварен интерфейс за заявки от гледна точка на CoGetClassObject/QueryInterface   -  person Dmitry    schedule 25.04.2018