C++ 代码更新 C# DLL 中的 GUI

C++ code updating the GUI in C# DLL

我有一个 C++ 应用程序(为特定硬件组件调用 SDK 的函数),并希望在 C# GUI 中显示其数据。 C# 部分是 C++ 调用的 DLL。 (这是应客户的要求,所以我没有太多选择。)

我不是很精通 C#,所以可能遗漏了一些明显的东西,但我 运行 在显示 GUI 和更新它方面遇到了问题。

我使用 this method 访问 C# 代码,代码大致如下(ptr 是一个 class 变量):

// Initialize COM.
CoInitialize(NULL);

ptr = new IPtr(__uuidof(ManagedClass));
(*ptr)->ShowForm();

然后在另一个线程中:

if (updating) (*ptr)->Update(data)

在 C# 方面,我们有:

FormClass myForm;
void ShowForm()
{
myForm = new FormClass();
Application.Run(myForm);
}
void Update(Data data)
{
myForm.Update(data)
}

当我使用 Application.Run 或 ShowDialog 显示我的 GUI 时,表单显示得很好,但更新使应用程序崩溃。使用 Show 会使 GUI 卡住。使用 BeginInvoke 导致 GUI 永远不会出现。

对于这种设置,有什么推荐的方法可以让我启动 GUI 吗?在 Update 中以某种方式使用 Invoke/BackgroundWorker 而不是直接调用 myForm 的方法会有帮助吗?

您必须在 UI 线程上更新 C# GUI。请参阅此答案以了解如何从另一个线程同步到 GUI 线程。

C# Windows Forms Application - Updating GUI from another thread AND class?

您可能还会发现“调试位置”工具栏可以方便地确定在 Visual Studio

中进行调试时您当前所在的线程

https://blogs.msdn.microsoft.com/davedev/2012/07/18/where-is-the-suspend-resume-and-terminate-toolbar-in-visual-studio-2012-ultimate/