【发布时间】:2014-08-12 10:44:13
【问题描述】:
我有一个 C# 类库 (dll),我想通过托管 C++ 静态库从非托管 C++ 应用程序中使用它。
Unmanaged C++ Project(.exe) --> Managed C++ Project(.lib) --> C# Class Library(.dll)
C# dll 有一个带有 WebBrowser 控件的表单,该控件是一个 COM 组件,问题就在于此。现在,我应该通过托管 C++ 静态库调用表单,当我这样做时,
Unhandled Exception: System.Threading.ThreadStateException: ActiveX control '885
6f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current th
read is not in a single-threaded apartment.
出现此错误。是的,这是由于当前线程不在单线程单元模型中。但是我不能将任何线程属性添加到我的入口点,因为该项目是一个非托管项目。
我还尝试创建一个新线程来打开表单,如here 所述。它起作用了,但是当我这样做时,WebBrowser 控件似乎没有响应事件。所以我不想创建一个新线程。那么有没有办法将当前正在运行的线程更改为 STA。另一个原因是我根本不想创建单独的线程。
我也试过CoInitialize,但我无法解决这个问题。
我无法将 STAThread 属性添加到入口点,因为入口点位于非托管 C++ 项目中。
出于某种原因,我不想在我的非托管项目中启用公共语言运行时支持。
有没有办法解决这个问题?
【问题讨论】:
-
您必须在 main() 函数中自己调用 CoInitializeEx()。并且泵送消息循环,STA 线程和 WebBrowser 的硬性要求将无法正常工作,如果您不这样做。如果您的本机程序无法提供这些保证,那么它就不是浏览器的合适宿主,您必须启动自己的线程。
标签: c# multithreading c++-cli