Возврат управляемого списка С# в неуправляемый код C++

Вопрос:

У меня есть С# dll (для которой установлен регистр для опции COM-взаимодействия).

Эта С# dll имеет интерфейс и класс ниже

interface IMyInterface
{
bool IsNameExists(string name);
List<string> GetNameList();
}

public class MyClass : IMyInterface
{

public bool IsNameExists(string name)
{
//DO Something

}
public List<string> GetNameList()
{

// DO something
}

}

Мне нужно вызвать методы IsNameExists и GetNameList из неуправляемого C++.

#import "..\..\ProdCon\bin\ProdCon.tlb" raw_interfaces_only

void main()
{
HRESULT hr =::CoInitialize(NULL);
IMyInterface pIMyInterface(__uuidof(MyClass));

VARIANT_BOOL bRet = FALSE;

BSTR bstrName = ::SysAllocString(_T("RAJESH"));
hr =  pIMyInterface->IsNameExists(bstrName,&bRet);

}

Поэтому я создал COM-объект, как указано выше, и назвал IsNameExists mehtod без каких-либо проблем.

Поскольку метод GetNameList возвращает список, я получаю следующее предупреждение

‘MyDll.IMyInterface.GetNameList(# 0), MyDll’. Предупреждение: экспортер библиотеки типов столкнулся с экземпляром универсального типа в сигнатуре. Общий код не может быть экспортирован в COM.

Пожалуйста, помогите мне, как вернуть список С# в неуправляемый код C++. Так что неуправляемый код C++ может использовать этот список.

Ответ №1

“Общий код не может быть экспортирован в COM”. =>, следовательно, его строка параметров типа в открытом списке GetNameList(). Таким образом, для получения данных вам необходим доступ к нестандартному методу С#.

Если у вас есть контроль над кодовой базой MyClass, вы можете (например) добавить:

public string[] GetNameArray()
{
return GetNameList.ToArray();
}

Если нет, вам нужно написать класс proxy/wrapper, чтобы сделать что-то похожее на вышеизложенное и показать, что через COM, либо в качестве одной, либо в “общей” методологии, используя рефлексию, скажите.

См. Например, http://weblog.west-wind.com/posts/2007/Jul/10/Generics-and-COM-Interop-dont-mix

Оцените статью
TechArks.Ru
Добавить комментарий