Создание C++ DLL для проекта C# — функции не экспортируются

Я работаю над проектом, который требует некоторой обработки изображений. Фронтенд программы написан на C# (потому что ребята подумали, что на нем намного проще сделать пользовательский интерфейс). Однако, поскольку часть обработки изображений требует много ресурсов процессора, я делаю эту часть на C++.

Идея состоит в том, чтобы связать его с проектом C# и просто вызвать функцию из DLL, чтобы сделать часть обработки изображения и позволить среде C# впоследствии обрабатывать данные. Теперь единственная проблема в том, что я не могу создать DLL. Проще говоря, компилятор отказывается помещать какую-либо функцию в DLL, которую я компилирую.

Поскольку проект требует некоторого тестирования времени разработки, я создал два проекта в решении C++. Один для Dll, а другой для консольного приложения. Консольный проект содержит все файлы, и я просто включаю соответствующий заголовок в свой файл проекта DLL. Я подумал, что компилятор должен убрать те функции, которые я пометил как экспортируемые, и сделать из них DLL. Тем не менее этого не происходит.

Вот как я определил функцию в заголовке:

extern "C" __declspec(dllexport)  void _stdcall RobotData(BYTE* buf, int** pToNewBackgroundImage, int* pToBackgroundImage,  bool InitFlag, ObjectInformation* robot1, ObjectInformation* robot2,   ObjectInformation* robot3, ObjectInformation* robot4,  ObjectInformation* puck);

extern "C" __declspec(dllexport)  CvPoint _stdcall RefPointFinder(IplImage* imgInput, CvRect &imgROI, 
                         CvScalar &refHSVColorLow, CvScalar &refHSVColorHi );

Далее следует реализация в файле cpp:

extern "C" __declspec(dllexport)  CvPoint _stdcall RefPointFinder(IplImage* imgInput, CvRect  &imgROI,&refHSVColorLow, CvScalar &refHSVColorHi ) { \\...
                  return cvPoint((int)( M10/M00) +  imgROI.x, (int)( M01/M00 ) +  imgROI.y) ;}

extern "C" __declspec(dllexport)  void _stdcall RobotData(BYTE* buf, int** pToNewBackgroundImage, int* pToBackgroundImage,  bool InitFlag, ObjectInformation* robot1, ObjectInformation* robot2,   ObjectInformation* robot3, ObjectInformation* robot4,  ObjectInformation* puck) { \\ ...};

И мой основной файл для проекта DLL выглядит так:

#ifdef _MANAGED
#pragma managed(push, off)
#endif

/// <summary> Include files.  </summary>
#include "..\ImageProcessingDebug\ImageProcessingTest.h"
#include "..\ImageProcessingDebug\ImageProcessing.h"


BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
 return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

Излишне говорить, что это не работает. Быстрый просмотр с помощью средства просмотра экспорта DLL 1.36 показывает, что в библиотеке нет никакой функции. Я не понимаю. Что я делаю неправильно? alt text Поскольку я не использую объекты C++ (и здесь это часть DLL C++), такие как вектор. Однако только для внутреннего использования. Они не будут отображаться в заголовках ни одной из функций, как видно из предыдущих фрагментов кода.

Любые идеи? Спасибо,

Бернат


person Yeti    schedule 17.03.2010    source источник
comment
Можете ли вы вызвать свою функцию из консольного приложения С++? Я бы начал с того, что сначала попробовал это.   -  person Pierre-Luc Champigny    schedule 18.03.2010


Ответы (1)


Кажется, вы не понимаете, какие файлы включать в проект DLL, а какие в консольный проект. Если верно, что «консольный проект содержит все файлы», то это ваша проблема.

Ваш проект DLL должен включать файл cpp, который имеет __declspec(dllexport)s. Как вы описываете, вы включили свои функции RefPointFinder() и RobotData() в консольный проект. Другими словами, в вашей DLL нет никаких функций, независимо от того, экспортируется ли что-либо.

Простое включение файлов .h в основной файл DLL само по себе ничего не дает. Он не включает эти функции в DLL.

person richb    schedule 17.03.2010
comment
Хорошо, это решило это на каком-то уровне. Я думал, что компилятор автоматически найдет файл реализации и воспользуется им. Изменение включения в файле DLL на следующее решило проблему: /// ‹summary› Включить файлы. ‹/summary› #include ..\ImageProcessingDebug\ImageProcessingTest.h #include ..\ImageProcessingDebug\ImageProcessing.cpp #include ..\ImageProcessingDebug\Modules.cpp - person Yeti; 18.03.2010
comment
Хотя это сработает, использование #include cpp-файлов необычно. Обычно вы компилируете их как отдельную единицу компиляции и связываете файлы .obj во время выполнения. - person richb; 18.03.2010