функция экспорта с параметрами clr из dll? - PullRequest
2 голосов
/ 28 декабря 2010

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

Для 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. Это, вероятно, просто, и я просто смотрю в неправильном направлении?

1 Ответ

2 голосов
/ 28 декабря 2010

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

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

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

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

...