2012-02-06 48 views
0

我有一個C++類,可以完成我需要它做的任何工作以及它的包裝,所以我可以通過C#訪問它。 C++類將線程類型設置爲APARTMENT THREADING,當我從另一個C++類訪問它時,它工作正常。如果我通過我的C#包裝器運行它,它只有在C++類設置爲多線程時纔有效。COINIT_APARTMENTTHREADING不起作用,而MULTITHREADING不能用於我的C#封裝類

我試圖設置包裝器在調用C++類之前啓動它自己的單元線程,但它似乎無法成功初始化線程。當我打印HRESULT時,它表示一切都成功完成。

我不知道我在這裏錯過了什麼,如果任何人都可以幫助,它將不勝感激。 在此先感謝! -Alex

+0

也許這個鏈接可能是有用的http://blogs.msdn.com/b/jfoscoding/archive/2005/04/07/406341.aspx – 2012-02-06 19:00:41

+0

由於沒有代碼,我們不能告訴你如何使用的東西。您通常不會在C#interop中擁有HRESULTS,這讓我想知道您是如何做的? – sehe 2012-02-06 19:18:52

+0

對不起,我打算說HRESULTS部分是在C++包裝部分。 – avtoader 2012-02-06 23:32:57

回答

1

是的,不起作用。除非創建了線程,否則一個班級不能可靠地設置線程的公寓。這當然不是這種情況,CLR創建了這個線程。並且已經調用CoInitializeEx(),選定的公寓以後不能更改。

如果您的C++代碼需要單線程單元,那麼C#代碼必須提供幫助。通過在Main()方法上放置[STAThread]屬性。或者當它創建自己的Thread來調用你的代碼時調用Thread.SetApartmentState()。線程池線程始終是MTA,不能更改。

這是一個完全合理的期望btw,很多本機代碼都有STA要求。請注意,C#代碼還必須抽取消息循環以使STA工作。如果您創建Winforms或WPF應用程序,這一切都將得到照顧。