gpt4 book ai didi

C#调用C++单例基于类的dll

转载 作者:行者123 更新时间:2023-11-28 06:42:36 29 4
gpt4 key购买 nike

我正在尝试从 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 中找不到入口点‘SetStatsMask’ .dll”。这是我的 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 的非公共(public)部分,您可以将它变成一个常规函数而不是一个成员函数,这样就可以了。

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;
}

关于C#调用C++单例基于类的dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25692364/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com