निम्नलिखित कोड उद्यम लाइब्रेरी की लॉगिंग आवेदन ब्लॉक में LogEntry.cs में मौजूद है:UnmanagedCode अनुमति। यह क्या है?
private bool UnmanagedCodePermissionAvailable
{
get
{
if (!unmanagedCodePermissionAvailableInitialized)
{
// check whether the unmanaged code permission is available to avoid three potential stack walks
bool internalUnmanagedCodePermissionAvailable = false;
SecurityPermission unmanagedCodePermission =
new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
// avoid a stack walk by checking for the permission on the current assembly. this is safe because there are no
// stack walk modifiers before the call.
if (SecurityManager.IsGranted(unmanagedCodePermission))
{
try
{
unmanagedCodePermission.Demand();
internalUnmanagedCodePermissionAvailable = true;
}
catch (SecurityException)
{ }
}
this.UnmanagedCodePermissionAvailable =
internalUnmanagedCodePermissionAvailable;
}
return this.unmanagedCodePermissionAvailable;
}
set
{
this.unmanagedCodePermissionAvailable = value;
unmanagedCodePermissionAvailableInitialized = true;
}
}
समारोह कई पी में से किसी से पहले कहा जाता है/आह्वान कॉल मदद करने के लिए LogEntry संरचना में भरने के विभिन्न जानकारी प्राप्त कर सके बना रहे हैं । यदि "UnmanagedCodePermission" उपलब्ध नहीं है, तो संबंधित LogEntry प्रॉपर्टी ऐसी स्ट्रिंग पर सेट की गई है जो इंगित करती है ("XXX उपलब्ध नहीं है")।
उदाहरण के लिए, लॉगइन्ट्री Win32 थ्रेड आईडी प्राप्त करना चाहता है और यह Win32 फ़ंक्शन, GetCurrentThreadId का उपयोग करता है, जिसे इसे प्राप्त करने के लिए पी/Invoke द्वारा बुलाया जाता है। GetCurrentThreadId को कॉल करने से पहले, यह देखने के लिए जांच करता है कि "असम्बद्ध कोड अनुमति" उपलब्ध है या नहीं। यदि ऐसा है, तो यह कॉल करता है, अगर नहीं, तो यह नहीं करता है। कुछ इस तरह:
private void InitializeWin32ThreadId()
{
if (this.UnmanagedCodePermissionAvailable)
{
try
{
this.Win32ThreadId = LogEntryContext.GetCurrentThreadId();
}
catch (Exception e)
{
this.Win32ThreadId = string.Format(
CultureInfo.CurrentCulture,
Properties.Resources.IntrinsicPropertyError,
e.Message);
}
}
else
{
this.Win32ThreadId = string.Format(CultureInfo.CurrentCulture,
Properties.Resources.IntrinsicPropertyError,
Properties.Resources.
LogEntryIntrinsicPropertyNoUnmanagedCodePermissionError);
}
}
मैं क्या समझ है, जो, बेशक, बहुत ज्यादा नहीं, अप्रबंधित कोड को कॉल कर रहा है (जैसे पी/आह्वान) है से हमेशा सुरक्षा/अनुमतियाँ/विश्वास की वजह से ही संभव है। यह जांचने के लिए कि अप्रबंधित कोड कॉल संभव है या नहीं, सभी अप्रबंधित कॉलों को एक समान तरीके से सुरक्षित करना संभव बनाता है।
मुझे इस कोड संकलन, मैं इस लाइन पर एक चेतावनी मिलती है:
System.Security.SecurityManager.IsGranted (System.Security.IPermission) ':
if (SecurityManager.IsGranted(unmanagedCodePermission))
यहाँ चेतावनी है अप्रचलित है: 'IsGranted अप्रचलित है और .NET Framework की भावी रिलीज में हटा दिया जाएगा। कृपया ऐपडोमेन या असेंबली की अनुमति अनुमति संपत्ति का उपयोग करें।
(ध्यान दें कि मैं इसे वीएस -2010 का उपयोग कर नेट 4.0 पर बना रहा हूं)।
तो, ऐसा लगता है कि IsGranted अप्रचलित है। मैंने AppDomain और असेंबली के लिए PermissionSet प्रॉपर्टी को देखा, और यह बिल्कुल स्पष्ट नहीं था कि एक ही चेक कैसे करें।
लॉगइन्ट्री के मामले में, ऐसा लगता है कि यह जानकारी महत्वपूर्ण नहीं है, इसलिए अगर अप्रबंधित अनुमति उपलब्ध नहीं है तो इसे महत्वपूर्ण विफलता नहीं माना जाता है। एक ही बिंदु से निम्नलिखित प्रश्नों पर विचार करें। यही है, अगर अप्रबंधित कोड अनुमति उपलब्ध नहीं है, तो यह एक बड़ा सौदा नहीं है, मैं जानकारी के बिना रह सकता हूं।
अंत में, सवालों की एक जोड़ी:
यह एक अच्छा विचार अप्रबंधित कोड (जैसे पी/आह्वान) के लिए कॉल की रक्षा के लिए प्रयास करने के लिए है? कभी-कभी, हमेशा, कभी नहीं?
यदि इन कॉलों की रक्षा करना एक अच्छा विचार है, तो क्या ऐसा करने के लिए यह एक उचित पैटर्न है? क्या कोई बेहतर तरीका है?
नेट 4.0 में समकक्ष चेक करने के लिए सही (यानी अप्रचलित नहीं) तरीका क्या होगा?