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

C++ code updating the GUI in C# DLL

本文关键字:中的 GUI C#DLL 更新 代码 C++      更新时间:2023-10-16

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

我对C#不是很精通,所以可能缺少一些明显的东西,但我在显示GUI和更新GUI时都遇到了问题

我使用这个方法访问C#代码,代码大致如下(ptr是一个类变量):

// 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)
}

当我使用应用程序时。运行或ShowDialog来显示我的GUI,表单显示得很好,但更新会导致应用程序崩溃。使用Show会使GUI陷入困境。使用BeginInvoke导致GUI从未出现。

在这种设置下,有什么建议我启动GUI的方法吗?在Update中使用Invoke/BackgroundWorker而不是直接调用myForm的方法会有帮助吗?

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

C#Windows窗体应用程序-从另一个线程和类更新GUI?

在VisualStudio中调试时,您可能还发现"调试位置"工具栏非常方便,可以确定当前所在的线程

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