COM-сервер C# вне процесса с пользовательским доступом

Мне нужно реализовать вне-серверный сервер в C#. Основная серверная часть готова, и сервер доступен через progid, например: "someNamespace.someClassname".

Но теперь я хочу что-то вроде этого: "progid:Application(set=somevalue)".

Есть ли способ сделать это в C#?

До сих пор я регистрирую фабрику, и эта фабрика возвращает объект com.

        Guid appClsId = new Guid(ComCst.ApplicationId);

        int hRes = ComNtv.CoRegisterClassObject(ref appClsId, new ApplicationFac(), 
            CLSCTX.LOCAL_SERVER, REGCLS.MULTIPLEUSE | REGCLS.SUSPENDED, out cokAppObj);
        if (hRes != 0)
        {
            throw new ApplicationException(
                "CoRegisterClassObject failed w/err 0x" + hRes .ToString("X"));
        }

        hRes = ComNtv.CoResumeClassObjects();
        if (hRes != 0)
        {
            if (cokAppObj!= 0)
            {
                ComNtv.CoRevokeClassObject(cokAppObj);
            }

            throw new ApplicationException(
                "CoResumeClassObjects failed w/err 0x" + hRes .ToString("X"));
        }

И это метод CreateInstance на заводе.

public int CreateInstance(IntPtr pUnkOuter, ref Guid riid,
        out IntPtr ppvObject)
    {
        ppvObject = IntPtr.Zero;

        if (pUnkOuter != IntPtr.Zero)
        {
            Marshal.ThrowExceptionForHR(ComCst.CLASS_E_NOAGGREGATION);
        }

        if (riid == new Guid(ComCst.ApplicationId) ||
            riid == new Guid(ComCst.IID_IDispatch) ||
            riid == new Guid(ComCst.IID_IUnknown))
        {
            IntPtr ptr = Marshal.GetComInterfaceForObject(
               new Application(), typeof(IApplication));

            ppvObject = ptr;
        }
        else
        {
            Marshal.ThrowExceptionForHR(ComCst.E_NOINTERFACE);
        }

        return 0;
    }

Информация: Существует уже реализованный C++ in-proc com сервер, который создает объект и регистрирует его в таблице запущенных объектов. Этот сервер затем возвращает моникер клиенту. Возможно ли сделать это в C#?

0 ответов

Другие вопросы по тегам