c# - 为 C# 项目创建 C++ DLL - 未导出函数

标签 c# c++ dll

我正在做一个需要一些图像处理的项目。该程序的前端是 C#(因为他们认为在其中制作 UI 更简单)。然而,由于图像处理部分需要大量的 CPU 资源,所以我用 C++ 编写了这部分。

想法是将它链接到 C# 项目,然后从 DLL 调用一个函数来制作图像处理部分,然后允许 C# 环境处理数据。现在唯一的问题是我似乎无法制作 DLL。简单地说,编译器拒绝将任何函数放入我编译的 DLL 中。

因为该项目需要一些开发时间测试,所以我将两个项目创建到一个 C++ 解决方案中。一个用于 Dll,另一个用于控制台应用程序。控制台项目包含所有文件,我只将相应的 header 包含到我的 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++ 对象(这里是 C++ DLL 部分),例如 vector 。但是,仅供内部使用。正如您可以从前面的代码片段中观察到的那样,这些不会出现在任一函数的 header 中。

有什么想法吗?谢谢,

伯纳特

最佳答案

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

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

仅在 DLL 主文件中包含 .h 文件本身没有任何作用。它不在 DLL 中包含这些函数。

关于c# - 为 C# 项目创建 C++ DLL - 未导出函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466342/

相关文章:

c# - 在 C# 中对数据进行分组和进行聚合计算

c# - 如何使用 C# 检索存储过程?

c++ - 如果使用命名空间后仍存在名称冲突怎么办?

c++ - 具有相同名称但不同签名的多个构造函数定义 (C++)

c++ - 为智能指针编写复制构造函数的问题

c++ - DLL 函数名称限制 - 函数名称末尾的数字可以吗?

c# - 使来自第三方库的扩展方法过时

c# - WinForms 中的数据绑定(bind)执行异步数据导入

dll - 何时包含 .lib 和何时包含 .dll 或两者

c# - VB.NET 和 sizeof