返回> 网站首页
C++调用C#的DLL,C#回调C++
yoours2021-01-28 15:00:04
简介一边听听音乐,一边写写文章。
一、C# 动态库代码示例
namespace FunInterFace
{
public class InterFace
{
public delegate int WorkDelegate(String u, int a, double r, long t);
WorkDelegate workDelegate = null;
public void Init(WorkDelegate w)
{
this.workDelegate = w;
}
public bool Open(String name)
{
// C++调用该接口
}
void OnReported(Report r)
{
workDelegate(r.u, r.a, r.r, r.t);
}
}
二、C++代码示例
.h 头文件
// 引入C#DLL
#pragma once
#ifdef _DEBUG
#using "Debug\InterFace.dll"
#else
#using "Release\InterFace.dll"
#endif
using namespace InterFace;
public ref class CJob
{
public:
static CJob^ Instance();
virtual ~CJob();
void Release();
private:
CJob();
static CJob^ _instance;
public:
int Work(System::String^ u, int a, double r, __int64 t);
private:
InterFace^ interFace;
};
.cpp文件
using namespace System;
using namespace System::Runtime::InteropServices;
CJob^ CJob::Instance()
{
if (_instance==nullptr)
{
_instance = gcnew CJob();
}
return _instance;
}
CJob::CJob()
{
interFace = gcnew InterFace();
}
CJob::~CJob()
{
}
void CJob::Release()
{
delete interFace;
delete _instance;
_instance = nullptr;
}
int CJob::Work(System::String^ u, int a, double r, __int64 t)
{
char* strU = (char*)(void*)Marshal::StringToHGlobalAnsi(u);
// 应用
return 0;
}
void CJob::Init()
{
InterFace::WorkDelegate^ methodWork = gcnew InterFace::WorkDelegate(this, &CJob::Work);
interFace->Init(methodWork);
}
bool CJob::Open(const char* name)
{
Init();
System::String^ name1 = System::Runtime::InteropServices::Marshal::PtrToStringAnsi((IntPtr)(char*)name);
return interFace->Open(name1);
}
void CJob::Close()
{
interFace->Close();
}