C++;为C#项目创建DLL-未导出任何函数

C++;为C#项目创建DLL-未导出任何函数,c#,c++,dll,C#,C++,Dll,我正在做一个需要一些图像处理的项目。程序的前端是C#(因为这些家伙认为在其中制作UI要简单得多)。但是,由于图像处理部分需要大量CPU汁,所以我在C++中制作了这个部分。p> 其想法是将其链接到C#项目,然后从DLL中调用一个函数来制作图像处理部分,并允许C#环境随后处理数据。现在唯一的问题是,我似乎无法创建DLL。简单地说,编译器拒绝将任何函数放入我编译的DLL中 因为项目需要一些开发时间测试,所以我已经将两个项目创建到C++解决方案中。一个用于Dll,另一个用于控制台应用程序。控制台项目保存

我正在做一个需要一些图像处理的项目。程序的前端是C#(因为这些家伙认为在其中制作UI要简单得多)。但是,由于图像处理部分需要大量CPU汁,所以我在C++中制作了这个部分。p> 其想法是将其链接到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
\ifdef\u管理
#pragma管理(推、关)
#恩迪夫
///包括文件。
#包括“.\ImageProcessingDebug\ImageProcessingTest.h”
#包括“.\ImageProcessingDebug\ImageProcessing.h”
BOOL APIENTRY DllMain(HMODULE HMODULE,DWORD ul_呼叫原因,LPVOID LPREFERED)
{
返回TRUE;
}
#ifdef_管理
#布拉格语管理(pop)
#恩迪夫
不用说,这是行不通的。使用DLL导出查看器1.36快速查看,可以发现库中没有函数。我不明白。我做错了什么? 作为边,我不使用C++对象(这里是C++ DLL部分),比如向量。但是,仅限内部使用。从前面的代码片段中可以看出,这两个函数的标题中都不会出现

有什么想法吗?Thx


Bernat

您似乎对DLL项目和控制台项目中包含哪些文件感到困惑。如果“控制台项目保存所有文件”是真的,那么这就是您的问题

您的DLL项目需要包含具有uu declspec(dllexport)的cpp文件。正如您所描述的,您已经在控制台项目中包含了RefPointFinder()和RobotData()函数。换句话说,无论是否导出任何内容,DLL中都没有任何函数


仅在DLL主文件中包含.h文件本身并没有任何作用。在DLL中不包含这些函数。< /P>你是否能够从C++控制台应用程序调用你的函数?我先试试这个。好吧,这在某种程度上解决了问题。我认为编译器会自动找到实现文件并使用它。将DLL文件中的include更改为以下内容解决了问题:///include文件#包含“.\ImageProcessingDebug\ImageProcessingTest.h”#包含“.\ImageProcessingDebug\ImageProcessing.cpp”#包含“.\ImageProcessingDebug\Modules.cpp”虽然这样做可以,但包含cpp文件是不常见的。通常,您将它们作为单独的编译单元进行编译,并在运行时链接.obj文件。