2015-02-24 88 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()。