2013-03-01 6 views
5

यह पहली बार है जब मुझे डिवाइस चालक के साथ बातचीत करने के लिए पी/Invoke का उपयोग करने की आवश्यकता है। DeviceIoControl समारोह में मैं डिवाइस के लिए संभाल के लिए SafeFileHandle का उपयोग करें और pinvoke.net का कहना है:डीएलएल आयात में सुरक्षितफाइल हैंडल

आप एक SafeFileHandle उपयोग करते हैं, CloseHandle कॉल नहीं करते के रूप में CLR यह तुम्हारे लिए बंद हो जाएगा।

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool CloseHandle(SafeFileHandle hObject); 

सच्चाई क्या है:

लेकिन सी # कुकबुक में मैं CloseHandle इस तरह का हस्ताक्षर पाया?

+0

आपको बुला के आरोप में होना चाहते हैं 'CloseHandle' फिर अपने को संभालने की घोषणा के बजाय' होने की IntPtr'। –

+0

@ डेविड हेफरनान, मैं इंटिप्टर के साथ सौदा नहीं चाहता हूं। सी # कुकबुक में इस कोड स्निपेट में ठोकर खाई गई जब मैं उलझन में था। – Oksana

+0

यदि आप 'DeviceIoControl' को कॉल करने जा रहे हैं तो मेरा सुझाव है कि आप 'IntPtr' के अपने डर को दूर करें। –

उत्तर

5

SafeFileHandle आंतरिक रूप से अपने ReleaseHandle विधि में CloseHandle कहता है, और एक Disposable पैटर्न के साथ में इस्तेमाल किया जा बनाया गया है, तो आप (सिर्फ DisposeClose विधि कॉल, या, बजाय) मैन्युअल CloseHandle(SafeFileHandle) साथ संभाल बंद करने के लिए नहीं करना चाहते हैं ।

और SafeFileHandlesealed है, मुझे वास्तव में "public static extern bool CloseHandle(SafeFileHandle hObject);" हस्ताक्षर में कोई बिंदु नहीं दिख रहा है।


संपादित

मैं सिर्फ your book googled और एक CloseHandle(SafeFileHandle) संदर्भ पाया। जैसी उम्मीद थी, यह प्रयोग किया जाता है नहीं, और SafeFileHandle ठीक से उपयोग बंद कर दिया है:

private void ClosePipe() 
{ 
    if (!_handle.IsInvalid) 
    { 
     _handle.Close(); 
    } 
} 
+0

इसमें स्पष्टता, धन्यवाद शामिल है। – Oksana

1

क्या आप देखते हैं कि Win32-API फ़ंक्शन खुले handle को बंद करने के लिए है। यह फ़ंक्शन तब उपयोग किया जाना चाहिए जब आप Win32-C/C++ का उपयोग कर रहे हों और सिस्टम-हैंडल के साथ काम करें। मैं ऊपर दिए गए कथन को सीएलआर के बारे में 100% मान्य नहीं कर सकता, लेकिन मुझे लगता है कि आप इसका इस्तेमाल नहीं करेंगे, ठीक है।

MSDN-CloseHandle पर कार्ट - Win32 के लिए कार्य देखें।

इसके अलावा यहां this आलेख है, जो सीएलआर के जीसी के बारे में बात करता है।

+0

[IDISposable में खोदना] (http://msdn.microsoft.com/en-us/magazine/cc163392.aspx#S7) - अच्छा लेख और मेरे लिए बहुत उपयोगी, धन्यवाद। – Oksana

+0

@ ओक्साना आपका स्वागत है :) –

संबंधित मुद्दे