2015-02-24 97 views
0

当我尝试从非主线程调用extern方法时,从C++线程编写的DLL中收到COM CoInitialize错误。C#编组调用C++ DLL。 COM和线程问题

只是稍微详细一点,我已经定义了一个别名在我的C#控制台项目中调用C++方法。

例如 [DllImport(“WRITTENINC++。dll”,CharSet = CharSet.Ansi)] public static extern Int32 DOTHIS(string s1,string s2,ref double d1,ref double d2);

而我把[STAThread]放在Program.Main方法之上。

当我在主线程中调用方法时,我得到了正确的结果。但是,如果我在不同的线程中运行相同的代码行(使用System.Threading和thread.Start()),则会出现有关COM初始化的错误。

假设我无法修改DLL,现在唯一的方法是将我的程序限制为单线程,这并不令人兴奋。

有没有解决这个问题的方法?

谢谢!

+0

添加确切的错误。您的线程没有被初始化为COM或它处于错误的公寓状态。 – 2015-02-24 21:45:28

+0

它看起来像DLL使用一些存储在全局变量中的STA COM对象,这是一个不好的设计,它会迫使你在DLL被初始化的同一个线程上调用DOTHIS。 – Noseratio 2015-02-25 00:22:48

+0

对于调用CoInitializeEx()的DLL中的代码来说,这是一个非常严重的错误。尤其是要求STA,DLL永远不能做出承诺。强烈考虑不使用这个DLL,它可能不是唯一的错误。如果必须使用代码[像这样](http://stackoverflow.com/a/21684059/17034)。 – 2015-02-25 09:39:10

回答

0

您必须在您使用COM的每个线程上调用CoInitialize()。