gpt4 book ai didi

c# - 从C#事件触发C++操作

转载 作者:行者123 更新时间:2023-12-02 10:06:10 27 4
gpt4 key购买 nike

抱歉,如果问题过于笼统,但我想知道什么是最佳解决方案。

我有两个项目。最主要的是 C++ ,需要从软件组件接收一些信息。为此,它使用一个.NET dll,该dll是我在 C#中编写的,并使用.NET库从软件组件接收信息。我将编写一个简单的CLI项目以获取C#项目获得的信息。

因此,我的问题是C#项目对事件的订阅很多,并且需要从软件组件异步接收信息。因此,我不知道如何在C++中触发操作(我的主项目使用此.NET dll从软件组件中请求信息)来保存此时已收集的所有数据。

例如,我在C#项目中拥有此事件订阅:

    private void SubscribeMessages()
{
comm.Comms.Subscribe(new Action<LoadFilterEVENTMessage>(LoadFilterEVENT));
}

private void LoadFilterEVENT(LoadFilterEVENTMessage msg)
{
FilterValue = msg.Filter;
}

因此,我希望这个LoadFilterEVENT让C++知道它已经具有过滤器值。有什么提示吗?

谢谢你高级:)

最佳答案

这里是一个解决方案:

1-您的C#dll需要加载 C++ SubscribeMessages DLL ,它将使用DispatchEvents方法来通知程序:

using System.Runtime.InteropServices;

namespace MyCSharpDLL
{
class PlatformInvokeTest
{
// Import C++ DLL
[DllImport("SubscribeMessages.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void DispatchEvents();

static void LoadFilterEVENT(/*LoadFilterEVENTMessage msg*/)
{
//FilterValue = msg.Filter;
DispatchEvents();
}

/* Methods in DLL being used below */
public static void Main()
{
LoadFilterEVENT();
}
};
}

2-函数 DispatchEvents属于 SubscribeMessages.dll(简单的C++ dll项目)具有释放二进制信号量以解锁C++程序的作用:
extern "C" __declspec(dllexport) void DispatchEvents()
{
// Juste open Semaphore
HANDLE ghSemaphore = OpenSemaphore (SEMAPHORE_ALL_ACCESS , TRUE, _T("SemSubscribeMessages"));
if ( NULL == ghSemaphore)
{
MessageBox(NULL,_T("Error when opening semaphore"),_T("Error"),0);
return;
}

// Release semphare in order that CPP program can be notified
ReleaseSemaphore(ghSemaphore, 1, NULL);
}

最后,您的C++程序必须等待 SemSubscribeMessages信号量才能接收通知。
由于等待的阻塞,我将 WaitForSingleObject函数放在单独的 线程中,它为您的主程序提供了更大的灵活性:
#include <windows.h>
#include <iostream>
using namespace std;

// Init value = 0 to block on the first call
#define INITIAL_COUNT 0

// Max value 1 to be a binarySemaphore
#define MAX_SEM_COUNT 1


DWORD WINAPI ListenNewEvent (LPVOID lpParam )
{
DWORD dwWaitResult;
HANDLE ghSemaphore = CreateSemaphore( NULL, INITIAL_COUNT, MAX_SEM_COUNT, _T("SemSubscribeMessages"));

if ( NULL == ghSemaphore) return -1;

while (true)
{
cout<< _T("Wainting for new Events ...")<<endl;
dwWaitResult = WaitForSingleObject( ghSemaphore, INFINITE);
MessageBox(NULL,_T("New Event arrive ..."), _T("Notification"),0);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwThreadId;
HANDLE hListnerThread = CreateThread( NULL, 0, ListenNewEvent, NULL, 0, &dwThreadId);

WaitForSingleObject (hListnerThread, INFINITE);

return 0;
}

结果:
运行主要的CPP程序时,您会得到:

enter image description here

C#dll发送通知后,您将获得:

enter image description here

如果您还需要共享数据(除了事件),则可以在通知后添加“共享内存”层……希望这对您有所帮助

关于c# - 从C#事件触发C++操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60115105/

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