C#项目的C ++ DLL创建 - 没有导出的函数

时间:2010-03-17 22:22:46

标签: c# c++ dll

我正在开发一个需要一些图像处理的项目。程序的前端是C#(因为人们认为在其中制作UI要简单得多)。但是,由于图像处理部分需要大量的CPU汁液,我在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 http://img401.imageshack.us/img401/9/20100317152758.jpg 另一方面,我没有使用C ++对象(这里是C ++ DLL部分),例如向量。但是,仅供内部使用。从前面的代码片段中可以看出,它们不会出现在任一函数的标题中。

有什么想法吗? THX,

Bernat

1 个答案:

答案 0 :(得分:0)

您似乎对DLL项目中包含哪些文件与控制台项目相混淆。如果确实“控制台项目包含所有文件”,那么这就是你的问题。

您的DLL项目需要包含具有__declspec(dllexport)的cpp文件。正如您所描述的那样,您已经包含了RefPointFinder()&amp; RobotData()在控制台项目中起作用。换句话说,无论是否导出任何内容,您的DLL都没有任何功能。

只包含DLL主文件中的.h文件本身不会做任何事情。它不包括DLL中的这些函数。