我正在尝试从C#调用C ++ dll。
C ++ dll是一个单例类,如下所示:.h文件(简体)
#if defined(STATS_MANAGER)
#define DllExport_StatsManager __declspec(dllexport)
#else
// definitions used when using DLL
#define DllExport_StatsManager __declspec(dllimport)
#endif
#pragma warning( push )
#pragma warning( disable : 4251 )
class DllExport_StatsManager StatsManager
{
private:
StatsManager();
static auto_ptr<StatsManager> _single;
public:
~StatsManager();
static StatsManager* getInstance();
void SetMaskPtr(unsigned short* maskPtr);
};
.cpp文件(简体)
#include "stdafx.h"
#include "StatsManager.h"
#include "ImageStats.h"
auto_ptr<LogDll> logDll(new LogDll(L".MyLoggingUnmanaged.dll"));
wchar_t message[256];
typedef void (_cdecl *statsPrototype)(long chan, long &numROI, long * min, long *max, double *mean, double *stdDev);
void (*statsFunctionPointer)(long chan, long &numROI, long * min, long *max, double *mean, double *stdDev) = NULL;
bool StatsManager::_instanceFlag = false;
bool StatsManager::_setupFlag = false;
StatsManager::StatsManager()
{
SetThreadBusyStatus(FALSE);
SetDataPtr(NULL);
SetMaskPtr(NULL);
hThread = NULL;
}
StatsManager::~StatsManager()
{
_instanceFlag = false;
}
auto_ptr<StatsManager> StatsManager::_single(new StatsManager());
StatsManager* StatsManager::getInstance()
{
if(! _instanceFlag)
{
try
{
_single.reset(new StatsManager());
wsprintf(message,L"StatsManager Created");
logDll->TLTraceEvent(VERBOSE_EVENT,1,message);
}
catch(...)
{
//critically low on resources
//do not proceed with application
throw;
}
_instanceFlag = true;
return _single.get();
}
else
{
return _single.get();
}
}
//model will call this function
long StatsManager::SetStatsMask(unsigned short *mask, long width, long height)
{
long ret = TRUE;
realloc(StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));
memcpy(mask,StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));
return ret;
}
在我的C#代码中,我想调用SetStatsMask(unsigned short *mask, long width, long height)
,但是它引发异常“在StatsManager.dll中找不到入口点'SetStatsMask' ”。这是我的C#代码:
[DllImport("StatsManager.dll", EntryPoint = "SetStatsMask")]
private static extern int SetStatsMask(IntPtr mask, int imgWidth, int imgHeight);
try
{
ea.Result = mask;
IntPtr maskPtr = Marshal.AllocHGlobal(2 * mask.Length);
Marshal.Copy(mask, 0, maskPtr, mask.Length);
SetStatsMask(maskPtr, width, height);
SaveMask("d:\\myMask.csv", mask);
}
catch (Exception e)
{
e.ToString();
}
我相信我的C ++ dll路径是正确的,因此在这一点上,我不确定是什么导致了此问题。任何人都可以提出一些建议吗?非常感激。谢谢。
编译器找不到,SetStatsMask()
因为它正在寻找类之外的函数。您不能DllImport
以此方式调用c ++类的函数。
我本来建议在StatsManager
类之外创建一个函数来调用它,但是看起来您的SetStatsMask()
成员函数不需要的任何非公共部分StatsManager
,您可以将其变成常规函数而不是成员函数。并乐于助人。
long SetStatsMask(unsigned short *mask, long width, long height)
{
long ret = TRUE;
realloc(StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));
memcpy(mask,StatsManager::getInstance()->GetMaskPtr(),width*height*sizeof(unsigned short));
return ret;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句