2010-01-19 12 views
7

जब सी में एक COM-दिखाई वर्ग को परिभाषित करने ++ मैं हेडर फाइल में समर्थित सूत्रण मॉडल (threading(single) लाइन) को परिभाषित कर सकते हैं:COM-interop के संपर्क में .NET ऑब्जेक्ट को सिंगल थ्रेडेड के रूप में कैसे चिह्नित किया जाए?

[ 
    coclass, 
    default(IComInterface), 
    threading(single), 
    vi_progid("Example.ComClass"), 
    progid("Example.ComClass.1"), 
    version(1.0), 
    uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD") 
] 

वहाँ .NET में सूत्रण मॉडल स्थापित करने का एक तुलनीय तरह से (के लिए है उदाहरण एक विशेषता)? मैं वर्तमान में इस तरह के रूप में मेरे COM-वर्ग को परिभाषित:

[Guid("67155A91-2948-43f5-B07F-5C55CDD240E5")] 
[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IComInterface 
{ 
    ... 
} 


[Guid("DC5E6955-BB29-44c8-9FC0-6AADEEB2AFFB")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Example.ComClass")] 
public class ComClass : IComInterface 
{ 
    ... 
} 

--edit:

उल्लेखनीय जवाब पर टिप्पणी वास्तव में महत्वपूर्ण घटक हैं। यह एक अलग थ्रेडिंग मॉडल सेट करने के लिए RegAsm को बताने का एकमात्र तरीका है, [ComRegisterFunction] विशेषता के साथ चिह्नित एक कस्टम पंजीकरण विधि लिखना है।

उत्तर

6

यह वास्तव में अस्पष्ट है, मैंने कभी भी MIDL में "थ्रेडिंग" विशेषता नहीं देखी है। न ही MSDN Library authors है।

एक COM coclass HKCR\CLSID\{guid}\InProcServer32 कुंजी का उपयोग करके रजिस्ट्री में अपनी थ्रेडिंग आवश्यकताओं को प्रकाशित करता है। थ्रेडिंग मॉडल मूल्य उस अपार्टमेंट को घोषित करता है जिसकी आवश्यकता है। यदि यह गुम है या "अपार्टमेंट" पर सेट है तो यह घोषणा की जाती है कि थ्रेड-सुरक्षित नहीं है और उसे एसटीए थ्रेड से मदद की आवश्यकता है। CoCreateInstance() इस मान का उपयोग करता है जब यह ऑब्जेक्ट बनाता है। यदि आवश्यक हो तो यह एक एसटीए थ्रेड शुरू करेगा और प्रॉक्सी बना देगा यदि वर्तमान थ्रेड एसटीए नहीं है, यह सुनिश्चित करना कि इसे हमेशा थ्रेड-सुरक्षित तरीके से उपयोग किया जाता है।

ए [कॉमविज़िबल] .NET कक्षा "दोनों" के रूप में पंजीकृत होगी, जो दर्शाती है कि एमटीए में धागे पर उपयोग करना ठीक है। बहुत आशावादी, लेकिन .NET दर्शन का पालन करता है कि सबकुछ थ्रेड-असुरक्षित है लेकिन सही जगहों पर lock कीवर्ड डालकर सुरक्षित बनाया जा सकता है। एक वादा जिसे अक्सर बीटीडब्ल्यू, जोखिम भरा परीक्षण नहीं किया जाता है। ThreadingModel मान को ओवरराइड करना (या इसे छोड़ना) को कोकलास को पंजीकृत करने के लिए लेखन कोड की आवश्यकता होती है, [comRegisterFunction] विशेषता के साथ सजाया गया है। पंजीकरण सेवा। रजिस्ट्रार टाइप टाइप कॉमक्लिएंट्स() बुनियादी कुंजी को जगह में लाने के लिए उपयोगी हो सकती है।

+2

मुझे लगता है कि ओपी MIDL विशेषताओं के बारे में बात नहीं कर रहा है। http://msdn.microsoft.com/de-de/library/zfbxt3zs.aspx – Henrik

+0

आप सही हैं। यह मेरा जवाब नहीं बदलता है। –

+0

मैंने अभी रजिस्ट्री की जांच की है और थ्रेडिंगमोडेल के लिए वर्तमान मान "दोनों" है, जो मैं नहीं ढूंढ रहा हूं। [ComRegisterFunction] के साथ चिह्नित विधि का उपयोग करके COM-Class मैन्युअल रूप से पंजीकृत करने के अलावा थ्रेडिंगमोडेल को सेट करने का कोई और तरीका नहीं है? – Xperimental