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