2012-10-09 29 views
3

我一直在閱讀很多關於COM公寓和.NET互操作,但我還沒有找到這個問題的答案呢。這讓我相信我可能會問錯誤的問題。哪個公寓是與COM Callable Wrapper關聯的?

我知道.NET線程,就像本地線程一樣,既可以是MTA也可以是STA,我可以在這裏找到相關文檔,但我很少看到這些對象及其CCW如何與這些公寓關聯。

我的猜測是CCW的線程模型是'Both',並且CCW與創建線程所屬的任何公寓相關聯。

哪個公寓是與CCW有關的,我能夠控制這種行爲嗎?

回答

3

.NET實現的COM對象通常可以在任何類型的COM公寓中生活。默認情況下,用於將.NET程序集註冊爲COM服務器的.NET方法/工具將使用線程模型註冊該程序集= Both

如果您想將.NET類作爲具有不同線程模型的COM coclass公開(例如強制進入STA),那麼您需要提供customised registration function

+0

我明白了,但是那些沒有被CoCreateInstance實例化的對象呢?例如,如果COM客戶端調用x.CreateWidget,並且該方法的實現返回一個新的.NET對象。返回的Widget的CCW會繼承x的CCW的公寓嗎? –

+0

這是一個非常好的問題。在默認情況下(線程模型=兩者),答案很明顯 - 正常的COM規則會將新對象放置在其創建者(x)的公寓中。但是,我不知道在創建新的COM包裝器以返回到非託管客戶端時,Interop層是否尊重自定義註冊:例如,如果x是Both而Widget註冊爲Apartment threaded(或反之亦然)。你可以試試看。 –

相關問題