gpt4 book ai didi

c# - c++ native 代码 DLL 使用抽象类到包装器中以在 C# 模块中使用

转载 作者:太空狗 更新时间:2023-10-29 23:12:38 24 4
gpt4 key购买 nike

您好,我在抽象类方面遇到了同样的问题。我正在尝试包装我的 cpp Dll 调用以在 C# 模块中使用。

Dll 正在使用工厂模式。其中包含一个类 Factory、MiddileWare 和它们的共同strong textresponding 子类。任何人都可以帮助我启动包装器。我被困在这之间。您的帮助将不胜感激。我在这里给出流程:

中间件工厂.h

#pragma once
#include "MiddleWareConnection.h"
#include "std afx.h"

#ifdef MIDDLEWAREFACTORY_EXPORTS
#define MIDDLEWAREFACTORY_API __declspec(dllexport)
#else

#define MIDDLEWAREFACTORY_API __declspec(dllimport) #endif

  MIDDLEWAREFACTORY_API enum eMiddleWareEngine
{
eRabitMQ = 0,
eZeroMQ,
eActiveMQ

};
// This class is exported from the MiddleWareFactory.dll

class MIDDLEWAREFACTORY_API CMiddleWareFactory
{
public:
CMiddleWareFactory(void);
~CMiddleWareFactory();
// TODO: add your methods here.

//Function to Create the object of Broker module:implemnted the Factory concept.
BOOL CreateInstance(CMiddleWareConnection** pMObj);
int m_eMomEngine;//To define which MOM need to enable.

};



extern MIDDLEWAREFACTORY_API int nMiddleWareFactory;

MIDDLEWAREFACTORY_API int fnMiddleWareFactory(void);

中间件连接.h

#pragma一次

类 CMiddleWareConnection { 公共(public):

  virtual ~CMiddleWareConnection(void)
{
}
//Pure virtual fuctions for interfacing
virtual BOOL Connect(int nServerType)=0;
virtual BOOL CreateSessionExchange() = 0;
virtual BOOL CreateQueue(LPCTSTR lpszQueueName) = 0;
virtual BOOL Disconnect() = 0;
virtual BOOL Send(void *MomItem,LPCTSTR lpszKey, int &nSendCount)=0;
virtual BOOL Receive() = 0;
virtual void StopReceiver() = 0;
virtual void GetData(void* pMsg, int &nMsgLen,int nMsgType,int &nReceiveCount)=0;
};

RabbitMQ.h

  #pragma once
#include "MiddleWareConnection.h"
#include "Amqp.h"
#pragma comment(lib, "rabbitmq.4.lib")
#define GET_DATA(a){memcpy(&a, pDataPtr, sizeof(a));pDataPtr+=sizeof(a);}
#define GET_DATA_EX(s,n){memcpy(s, pDataPtr, n);pDataPtr+=n;}

typedef struct _ROUTINE_KEY
{
CString RoutingKey;

}ROUTEKEY, *LPROUTEKEY;

class CRabbitMQ :
public CMiddleWareConnection
{
public:

CRabbitMQ(CAppConfig &rConfig);
~CRabbitMQ();
void InitializeRBMQ(CAppConfig &rConfig);//Initialize RBMQ Config;
BOOL Connect(int nServerType);
BOOL Disconnect(void);
BOOL Send(void *MomItem, LPCTSTR lpszKey, int &nSendCount);
BOOL Receive(void);
BOOL CreateQueue(LPCTSTR lpszQueueName);
BOOL CreateSessionExchange();
BOOL BindQueue(LPCTSTR lpszQueue, LPCTSTR lpszExchangeName, LPCTSTR lpszKey);
bool IsConnected(){return m_bConnected;}
void SetKeyQueueCombination( TCHAR *pszQueueName, TCHAR *pszRoutingKey);
void StopReceiver();
bool ReEstablishRMQMWConnection();
void GetData(LPBYTE &pMsg, int &nMsgLen,int &nReceiveCount);
void GetData(void* pMsg, int &nMsgLen,int nMsgType,int &nReceiveCount);
BOOL GetNext_JasonListItem(LPJASON_ITEM pItem);
LPRABBIT_MQ_ITEM GetNextItem();

};

在这里,我想公开 rabbitMq 类函数[从 MiddleWareConnection.h 到 C# 模块的连接、发送、接收等。

谢谢

最佳答案

下面我发布了一个包装 C++/CLI 类的小代码示例。您可以创建一个新的 C++/CLI 项目,它链接您的 native 库并按照下面的示例创建一个类。这将生成一个托管程序集,您可以从 C# 端引用它。希望对您有所帮助!

#include <Windows.h>
#include <vcclr.h>

using namespace System;
using namespace System::Text;
using namespace System::Collections::Generic;
using namespace System::Runtime::InteropServices;

public ref class CMiddleWareConnection_Net
{
public:

CMiddleWareConnection_Net()
{
pMiddleWareConnection = NULL;
}

~CMiddleWareConnection_Net()
{
//Release pMiddleWareConnection
if (pMiddleWareConnection)
delete pMiddleWareConnection;
}

void InitializeRBMQ(CAppConfig_Net config)
{
// CAppConfig_Net is another ref class
// which provides a toNative method
// returning a plain C++ CAppConfig object
CAppConfig rConfig = config.toNative();

pMiddleWareConnection = CRabbitMQ(rConfig);
}

bool Connect(int nServerType)
{
return (pMiddleWareConnection->Connect(nServerType) == TRUE);
}

bool Disconnect(void)
{
return (pMiddleWareConnection->Disconnect() == TRUE);
}

bool Send(array<Byte>^ MomItem, String^ lpszKey, int% nSendCount)
{
//Assuming MomItem is a byte array...
unsigned char *pData = new unsigned char[MomItem->Length];
Marshal::Copy(MomItem, 0, IntPtr(pData), MomItem->Length);

//Marshal String^ to LPCSTR
IntPtr ip = Marshal::StringToHGlobalAnsi(lpszKey);
LPCSTR str = static_cast<LPCSTR>(ip.ToPointer());

bool bRet = (pMiddleWareConnection->Send(pData, str, nSendCount) == TRUE);

//Freeing memory
delete[] pData;
Marshal::FreeHGlobal(ip);

return bRet;
}

bool Receive(void)
{
return (pMiddleWareConnection->Receive() == TRUE);
}

/* Other methods */
...

private:
CMiddleWareConnection *pMiddleWareConnection;

};

关于c# - c++ native 代码 DLL 使用抽象类到包装器中以在 C# 模块中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44963179/

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