Как сделать C # Com объектом GlobalMultiUse? - PullRequest
0 голосов
/ 04 мая 2018

Я выполняю COM-взаимодействие (клиент VBA), и есть функция, которую я, возможно, воспринял как должное, доступен глобальный готовый объект, если в idl вы используете атрибут idl appobject. Это работает в ATL / C ++, поэтому я могу написать следующий IDL (проект ATL)

[
    uuid(183343ca-6154-4c1e-9a6b-927e5b279332),
    version(1.0),
]
library GlobalCOMObjectLib
{
    importlib("stdole2.tlb");

    [
        odl,
        uuid(f1bd66ae-4fc9-45a4-8a2b-60df31d9bcfe),
        version(1.0),
        dual,
        oleautomation
    ]
    interface ISampleGlobalObject : IDispatch
    {
        HRESULT Line([in]BSTR sIn, [out, retval] BSTR* outRetVal);
    };

    [
        uuid(6a905a18-37d2-4ac1-a663-871f7dc99af7),
        version(1.0),
        appobject 
    ]
    coclass SampleGlobalObject
    {
        [default] interface ISampleGlobalObject;
    };
};

и тогда в VBA мне не нужно Новый кокласс я могу написать следующее

Sub TestGlobal3()
    Debug.Print SampleGlobalObject.Line("hello")
End Sub

Как сделать то же самое в C #, appobject, поскольку атрибут не распознан (волнистая линия)

namespace foo
{
    public interface ISampleGlobalObjectCSharp
    {
        string Line(string sLine);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(ISampleGlobalObjectCSharp))]
    [appobject]
    public class SampleGlobalObject : ISampleGlobalObjectCSharp
    {
        string ISampleGlobalObjectCSharp.Line(string sLine)
        {
            return sLine;
        }
    }

Поиск в Интернете встречает страницы, расширенные в эпоху перехода от VB6 к C #, и они предполагают, что это невозможно. Термин VB6 равен GlobalMultiUse, если это вызывает какие-либо воспоминания.

...