返回> 网站首页 

C++调用C#的DLL,C#回调C++

yoours2021-01-28 15:00:04 阅读 2889

简介一边听听音乐,一边写写文章。

一、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();

}


微信小程序扫码登陆

文章评论

2889人参与,0条评论