Как выявить аргументы метода интерфейса С# как конкретные типы COM/ODL?

Я определяю интерфейс в С#, который будет реализован в С#, но вызывается из неуправляемого модуля C++ в качестве COM-объекта.

Я знаю, что мне нужно/нужно, чтобы C++ API выглядел и как я определял его через ODL:

//args is an array of BSTR e.g VT_ARRAY|VT_BSTR
HRESULT DoMethod(/*[in]*/BSTR name, /*[in]*/VARIANT args);

Я не уверен, как установить это на С#, чтобы определение TLB соответствовало этому, в отношении VARIANT. Может быть, это так просто:

void DoMethod(string name, string args[])

Я просматривал документацию по совместимости COM/.NET, но либо я пропустил этот раздел, либо просто не понимаю, что описано!

Как в стороне, как я могу увидеть, какое определение COM выбрано для данного интерфейса С#? Является ли DLL/TLB легко проверенным?

0
источник поделиться
1 ответ

Если вы хотите вариант на стороне C++ (почему?), Вам нужно объявить его:

using System.Runtime.InteropServices;

namespace LibraryName {
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IFoo {
        void DoMethod(string name, object args);
    }
}

Зарегистрируйте сборку С# с помощью Regasm.exe/codebase/tlb. Параметр /tlb генерирует библиотеку типов, вы можете использовать ее в коде C++ с директивой #import. Этого достаточно, чтобы посмотреть, файл LibraryName.tlh, который он создает, имеет декларации. Или вы можете запустить Oleview.exe из командной строки Visual Studio и использовать File> View Typelib, чтобы посмотреть на него.

Исходный инстинктивный выбор лучше, строка [] отображается как SAFEARRAY * на стороне C++. Меньше несчастных случаев.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос