C#调用C++;基于单例类的动态链接库
我试图从C到C++调用dll。C#调用C++;基于单例类的动态链接库,c#,c++,dll,marshalling,C#,C++,Dll,Marshalling,我试图从C到C++调用dll。 C++ DLL是一个单独的类,如下: .h文件(简化) 我相信C++的DLL路径是正确的,因此在这一点上,我不确定是什么导致了这个问题。谁能给点建议?非常感谢。谢谢。编译器找不到SetStatsMask(),因为它正在查找类之外的函数。不能使用 dLimPult以这种方式调用C++类的函数。< /P> 我本来打算建议在StatsManager类之外创建一个函数来调用它,但是看起来您的SetStatsMask()成员函数不需要StatsManager的任何非公共部
C++ DLL是一个单独的类,如下: .h文件(简化)
<>我相信C++的DLL路径是正确的,因此在这一点上,我不确定是什么导致了这个问题。谁能给点建议?非常感谢。谢谢。编译器找不到
SetStatsMask()
,因为它正在查找类之外的函数。不能使用<代码> dLimPult以这种方式调用C++类的函数。< /P>
我本来打算建议在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;
}
#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;
}
[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();
}
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;
}