我有一个C ++类,可以完成我需要它完成的任何工作以及它的包装器,因此我可以通过C#访问它。 C ++类将线程类型设置为APARTMENT THREADING,当我从另一个C ++类访问它时,它工作正常。如果我通过我的C#包装器运行它,它只有在C ++类设置为多线程时才有效。
我尝试在调用C ++类之前设置包装器以启动它自己的单元线程,但它似乎无法成功初始化线程。当我打印HRESULT时,它表示一切都已成功完成。
我不知道我在这里缺少什么,如果有人可以提供帮助,我们将不胜感激。 提前致谢! -Alex
答案 0 :(得分:1)
是的,不起作用。除非创建线程,否则类无法可靠地设置线程的单元。这肯定不是这种情况,CLR创建了这个线程。并且已经调用了CoInitializeEx(),之后无法更改所选公寓。
如果你的C ++代码需要一个单线程的公寓,那么C#代码必须提供帮助。通过将[STAThread]属性放在Main()方法上。或者在创建自己的Thread来调用代码时调用Thread.SetApartmentState()。线程池线程始终是MTA,无法更改。
这是一个完全合理的期望btw,许多本机代码都有STA要求。请注意,C#代码还必须提供消息循环以使STA工作。如果您创建Winforms或WPF应用程序,这一切都会得到解决。