मैं COM के लिए नया हूं और एसटीए और एमटीए के बीच अंतर को समझने की कोशिश कर रहा हूं। मैंने एक उदाहरण बनाने की कोशिश की जो दिखाएगा कि COM एसटीए में बनाए गए ऑब्जेक्ट पर कॉल प्रबंधित कर सकता है जो थ्रेड-सुरक्षित नहीं है।ओथ एसटीए धागे से STAThread से बनाए गए COM ऑब्जेक्ट को कॉल नहीं कर सकता
MyCalcServer
कक्षा यहां एटीएल सरल वस्तु का उपयोग करके बनाई गई है। इस्तेमाल किया सेटिंग्स this article में के रूप में ही कर रहे हैं:
- थ्रेडिंग मॉडल: अपार्टमेंट
- एकत्रीकरण: नहीं
- इंटरफ़ेस: कस्टम
MyCalcServer
COM वस्तु में प्रयोग किया जाता है एक और सी # परियोजना जो है:
class Program
{
[STAThread]
static void Main(string[] args)
{
MyCOMLib.MyCalcServer instance = new MyCOMLib.MyCalcServer();
string output1;
instance.ChangeValue("Gant", out output1);
Console.WriteLine(output1);
Thread t1 = new Thread(() =>
{
while (true)
{
string output;
instance.ChangeValue("Gant", out output);
Console.WriteLine(output);
}
});
t1.SetApartmentState(ApartmentState.STA);
t1.Start();
// :
// also has t2 and t3 here with similar code
// :
t1.Join(); t2.Join(); t3.Join();
}
}
हालांकि, यह हमेशा InvalidCastException
(E_NOINTERFACE) में टी 1 के कोड के अंदर उठाया जाता है। मैंने बिना किसी सफलता के अपार्टमेंटटास्ट को एमटीए में बदलने की भी कोशिश की है।
Unable to cast COM object of type 'MyCOMLib.MyCalcServerClass' to interface type 'MyCOMLib.IMyCalcServer'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{B005DB8C-7B21-4898-9DEC-CBEBE175BB21}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
क्या कोई कृपया बता सकता है कि मैं यहां क्या गलत कर रहा हूं?
शायद जेआईटी सोचता है कि आप "इंस्टेंस" का उपयोग नहीं कर रहे हैं और इसे जल्दी रिलीज़ करते हैं। मार्शल डालने का प्रयास करें। शामिल होने के बाद ReeleaseComObject (उदाहरण)। – adrianm
@adrianm अभी भी काम नहीं कर रहा है लेकिन इस – Gant
के लिए धन्यवाद MyCOMLib.IMyCalcServer इंस्टेंस = नई MyCOMLib.MyCalcServer() पर पहली पंक्ति को बदलने का प्रयास करें; मुझे लगता है कि केवल इंटरफेस (वर्ग नहीं) धागे के बीच marshalled किया जा सकता है। – adrianm