функция экспорта с параметрами clr из dll?

У меня есть устаревшая управляемая dll c ++, и мне нужно вызвать некоторую функцию, которая возвращает управляемый тип.

Для dllexports без управляемых типов это просто, я просто определяю свою статическую функцию c (++) в таком заголовке:

extern "C" 
{
  __declspec(dllexport)  int  __cdecl  InitSystem();
}

Но теперь статическая функция c (++) должна возвращать управляемый тип, и здесь у меня проблема. Если я попробую (например):

extern "C" 
{
  __declspec(dllexport)  System::Collections::Generic::List<System::String^>^  __cdecl  InitSystem();
}

Я получаю ошибку компилятора (для определения функции нужна подпись __clrcall).

Поскольку DLL не является сборкой (я думаю), я немного не понимаю, как экспортировать простой вызов функции с использованием параметров .net / clr. Это, наверное, просто, и я просто смотрю не в том направлении?


person Sam    schedule 28.12.2010    source источник


Ответы (1)


Это должна быть сборка, другого способа создать код с таким управляемым типом нет. Смешивание управляемого и собственного кода в одной сборке - это нормально. Что автоматически решает проблему, функция будет доступна в метаданных, экспортировать ее не нужно. Вам нужно отбросить все украшение, его нельзя применить к управляемому методу. И он должен быть в классе ref, чтобы другие управляемые языки могли его использовать.

public ref class Mumble {
public:
    static System::Collections::Generic::List<System::String^>^  InitSystem();
};

Программа на C # теперь может использовать var lst = Mumble.InitSystem (). Рекомендуется использовать пространство имен.

Остерегайтесь / clr, кстати, он без проблем преобразует нативный код в IL. Либо отключите / clr для файла с исходным кодом, либо используйте #pragma managed.

person Hans Passant    schedule 28.12.2010