在Microsoft的All-In-One代碼示例CSExeCOMServer中記錄的C#中創建進程外COM服務器時,似乎很難控制線程模型的服務器中創建的對象(由客戶端)。控制.NET進程服務器提供的COM對象的線程模型
對象被創建需要在一個STA由於它使用WPF對象,並且表現出對線的ExeCOMServer.cs 95和粘貼下面它的工廠正在註冊的事實...
private void PreMessageLoop()
{
//
// Register the COM class factories.
//
Guid clsidSimpleObj = new Guid(SimpleObject.ClassId);
// Register the SimpleObject class object
int hResult = COMNative.CoRegisterClassObject(
ref clsidSimpleObj, // CLSID to be registered
new SimpleObjectClassFactory(), // Class factory
CLSCTX.LOCAL_SERVER, // Context to run
REGCLS.MULTIPLEUSE | REGCLS.SUSPENDED,
out _cookieSimpleObj);
if (hResult != 0)
{
throw new ApplicationException(
"CoRegisterClassObject failed w/err 0x" + hResult.ToString("X"));
}
但是,CreateInstance函數總是在MTA中的新線程中調用。似乎並不重要,本地服務器的主線程被標記(並驗證)爲STA線程。
已發現此事的所有材料都暗示所創建物件的公寓應該與工廠註冊線程的公寓相匹配。實際上,在使用ATL COM服務器(與Managed C++混合創建對象)時,似乎就是這種情況,但是此方法似乎將一個新線程注入了初始化參數的工作流,特別是COM線程模型,似乎不可更改。
有沒有人解決這個問題,而不訴諸於主要寫在非託管代碼中的COM服務器。
呃,我*討厭他們提出的廢話。當他們在中國受僱時,我與MSDN論壇密切相關。當時我是一個社區mod。圖書館根本沒有同行評議,它跨越了「55%準確」的角度。尤其是那個叫「葛」的人,對他的無知是非常危險的。服務器的線程模型受服務器初始化COM的方式影響。不是客戶。 – 2010-10-11 22:34:42
感謝您的洞察力......但這個例子似乎對它的功能足夠好。讓MTA初始化我們的對象在技術上並不正確。令人困惑的部分是_SERVER_的主線程屬於STA,但框架(COM,OLE,無論)在服務器的MTA中的服務器中創建一個新線程,以調用Factory的CreateInstance。 – Steven 2010-10-12 00:36:50