c# - WPF 并发模型

标签 c# c++ wpf unmanaged

我正在开发一个 C# WPF 应用程序,它使用 PInvoke 调用非托管 C++ DLL 函数。 WPF 应用程序是使用 Blend 创建的。

非托管 C++ DLL 从 PInvoke 函数调用 CoInitializeEx(NULL, COINIT_MULTITHREADED)。我在这行代码中收到一条错误消息,提示 "COM library already initialized with incompatible concurrency model"

我假设 WPF 本身就是 STAThread。我对吗?

如何修复上述错误?

最佳答案

是的,WPF UI 线程会将 COM 单元状态初始化为单线程。如果它不是单线程单元,那么一大堆东西都会失败。

您需要启动一个新线程并调用您的 C++ DLL 并确保该线程的单元状态是多线程的。可以使用 Thread.SetApartmentState 设置线程的单元状态, 但默认情况下所有新线程都是多线程的。

关于c# - WPF 并发模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16755106/

相关文章:

c# - DbMigration.AlterstoredProcedure( Entity Framework 迁移): How to represent type smallmoney?

c++ - 在不知道大小的情况下在 Borland C++ 构建器中定义 AnsiString 矩阵

c# - 如果我将一个控件绑定(bind)到另一个控件,并且其中一个控件死亡,那么绑定(bind)会发生什么情况?

c# - 动态菜单项中的 "System.Windows.Data Error: 4"

c++ - 运算符 -> 不适用于自定义输入迭代器

wpf - 使用响应式(Reactive)命令

c# - monitor.wait 是否向其他线程发出信号

c# - WPF 确定用户在 ItemsControl 中单击的 DataTemplate 对象

c# - XmlReader.Name 返回空值

c++ - 如何使 char 数组与输入的大小相同(或者可以使用字符串库而不是 C 样式数组字符串来完成)?