2015-10-07 4 views
0

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

Я знаю, что я хочу/нужен API C++, чтобы выглядеть и как я бы определить его с помощью ОЛЗ:

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

я не уверен, как установить это в C#, чтобы вызвать TLB чтобы соответствовать этому, в отношении VARIANT. Может быть, это так просто:

void DoMethod(string name, string args[]) 

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

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

ответ

1

Если вы хотите вариант на стороне C++, то вам нужно объявить:

using System.Runtime.InteropServices; 

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

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

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

+0

Итак, объект <--> VARIANT, я нашел это документированным после того, как его спросили, но я еще не уверен, как создать этот объект для сортировки как подходящего варианта варианта? Не могли бы вы добавить (псевдо) реализацию 'DoMethod()'? Что касается варианта Vs safearray - наш первоначально проект на C++ всегда делал это так, а не пропускал голые safearrays. Я не мог сказать, почему, это почти 20 лет! –

+0

Erm, не уверенный, как этот запрос может иметь смысл, это вызывающий, который должен создать массив и заполнить его в варианте. DoMethod() потребляет его. –

+0

Да, ты прав. Хотя, если бы это был параметр out, мне все равно был бы интересен тот же самый основной вопрос, это не моя потребность прямо сейчас ... спасибо за это. –

 Смежные вопросы

  • Нет связанных вопросов^_^