如何解决C++中的COM问题? 我有一个C类的库DLL,我想通过一个托管C++静态库从非托管C++应用程序使用。p> Unmanaged C++ Project(.exe) --> Managed C++ Project(.lib) --> C# Class Library(.dll)

如何解决C++中的COM问题? 我有一个C类的库DLL,我想通过一个托管C++静态库从非托管C++应用程序使用。p> Unmanaged C++ Project(.exe) --> Managed C++ Project(.lib) --> C# Class Library(.dll),c#,multithreading,c++-cli,C#,Multithreading,C++ Cli,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

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.
发生此错误。是的,这是由于当前线程不在单线程单元模型中。但我无法向入口点添加任何线程属性,因为该项目是非托管项目

我还尝试创建一个新线程来打开表单,如所述。它工作了,但当我这样做时,WebBrowser控件似乎对事件没有响应。所以我不想创建一个新线程。那么有没有办法将当前正在运行的线程更改为STA呢。另一个原因是我根本不想创建一个单独的线程

我也尝试了协同初始化,但我无法解决这个问题

我不能将STATTHORE属性添加到入口点,作为非托管C++项目中的入口点。

出于某种原因,我不想在非托管项目中启用公共语言运行时支持


有什么方法可以解决这个问题吗?

继续,将[STAThread]添加到应用程序的主条目中,这表明COM线程模型是单线程的

例如:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new WebBrowser());
    }
}

不,我不能将STATTHORE属性添加到入口点,因为它是非托管C++项目。我想在本地C++项目中做与STATTHOST属性等价的东西。这就是我问这个问题的原因。您必须在主函数中自己调用CoInitializeEx。而且,如果您不这样做,那么对STA线程和WebBrowser的硬要求将无法正常工作。如果您的本机程序不能提供这些保证,那么它就不是浏览器的合适主机,您必须启动自己的线程。