मेरे पास एक कक्षा है जो प्रक्रिया से बाहर एक COM exe को तुरंत चालू करती है। वर्गसी # सफाई अपरिवर्तित संसाधन जब प्रक्रिया मारे जाती है
public class MyComObject:IDisposable
{
private bool disposed = false;
MyMath test;
public MyComObject()
{
test = new MyMath();
}
~MyComObject()
{
Dispose(false);
}
public double GetRandomID()
{
if (test != null)
return test.RandomID();
else
return -1;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (test != null)
{
Marshal.ReleaseComObject(test);
test = null;
}
disposed = true;
}
}
है और मैं इसे कहते हैं
static void Main(string[] args)
{
MyComObject test = new MyComObject();
MyComObject test2 = new MyComObject();
//Do stuff
test.Dispose();
test2.Dispose();
Console.ReadLine();
}
इस प्रकार अब, इस जब कार्यक्रम सामान्य रूप से निष्पादित करता है मेरी कॉम वस्तु को साफ। हालांकि, अगर मैं अपने निष्पादन के बीच में प्रोग्राम बंद करता हूं, तो फ्रेमवर्क कभी भी उस कोड को कॉल नहीं करता है जो मेरी अप्रबंधित वस्तु को जारी करता है। जो काफी उचित है। हालांकि, क्या इस कार्यक्रम को खुद को साफ करने के लिए मजबूर करने का कोई तरीका है, भले ही इसे मारा गया हो?
संपादित करें:
using (MyComObject test = new MyComObject())
using (MyComObject test2 = new MyComObject())
{
//Do stuff
}
अनिवार्य रूप से करने के लिए finally
ब्लॉकों डालता है यही कारण है कि: यह taskmanager :(
जो या तो काम नहीं करता है। यदि मैं उपयोग ब्लॉक के बीच में प्रक्रिया को मारता हूं तो COM सर्वर जीवित रहते हैं। – Steve
आप प्रक्रिया को कैसे मार रहे हैं? क्या आपने यह देखने के लिए अपने निपटान ब्लॉक में कोई लॉगिंग किया है कि क्या हो रहा है? –
(सामान्य शटडाउन के साथ प्रोग्राम को बंद करना ठीक होना चाहिए। टास्क मैनेजर से इसे समाप्त करना नास्टियर होने की संभावना है।) यदि आप "सामान्य" तरीके से प्रोग्राम बंद करते हैं तो COM सर्वर ठीक से बंद हो जाता है? –