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

我正在尝试从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路径是正确的,因此在这一点上,我不确定是什么导致了此问题。任何人都可以提出一些建议吗?非常感激。谢谢。

乔尔·朗多(Joel Rondeau)

编译器找不到,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章