Создание 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++), такие как вектор. Однако только для внутреннего использования. Они не будут отображаться в заголовках ни одной из функций, как видно из предыдущих фрагментов кода.

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

Бернат


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


Ответы (1)


arrow_upward
0
arrow_downward

Кажется, вы не понимаете, какие файлы включать в проект 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