से अप्रबंधित सी/सी ++ डीएलएल कार्यों को कॉल करना मेरे पास सी/सी ++ फ़ंक्शंस की एक विशाल लाइब्रेरी है, जिसे SQL Server 2008 से कॉल करने की आवश्यकता है। मैंने एक सी # एडाप्टर क्लास लिखा है जो Win32 DLL से इन कार्यों को लोड करता है DllImport
के साथ और उन्हें .Net कोड में प्रकट करता है। यह अधिकांश .NET अनुप्रयोगों में पूरी तरह से ठीक काम करता है।
अब, मैं SQL सर्वर सीएलआर के साथ एक ही तकनीक का उपयोग करने की कोशिश कर रहा था। मैं सीएलआर कार्यों और संग्रहित प्रक्रियाओं का एक सेट बनाता हूं, जो एडाप्टर वर्ग को कॉल करते हैं। यह System.BadImageFormatException
में अप्रबंधित DLL परिणामों को लोड करने के प्रयासों के रूप में कार्य नहीं करता है।
मैं विस्तारित संग्रहीत प्रक्रियाओं के साथ ऐसा कर सकता हूं, लेकिन उस विधि को बहिष्कृत किया गया है और SQL सर्वर की किसी भी नई रिलीज़ में बंद कर दिया जा सकता है।
सीएलआर संग्रहीत प्रक्रिया से अप्रबंधित कार्यों को कॉल करने का सही तरीका क्या होगा? मेरा अनुमान है कि यह प्रक्रिया से बाहर किया जाना चाहिए।एसक्यूएल सर्वर 2008
मैं अपनी संग्रहित प्रो को एक वेब सेवा कॉल करने की कोशिश कर रहा हूं जो इन कार्यों को उजागर करता है। यह एक अच्छा विचार की तरह लगता है, लेकिन अब तक मुझे SQLCLR असेंबली को तैनात करने में समस्या है जो वेब सेवा कॉल करता है। मैं System.ServiceModel.dll
असेंबली version=3.0.0.0
लोड नहीं कर सकता, जिस पर System.Web.dll
असेंबली संस्करण 2.0.0.0
पर निर्भरता है।
लोड हो रहा है System.Web
विधानसभा मुझे निम्न त्रुटि देता है:
Assembly 'System.Web' references assembly 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: version, culture or public key mismatch). Please load the referenced assembly into the current database and retry your request.
मैं System.Web
विधानसभा की तैनाती की समस्या के लिए समाधान मिल गया है। C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll
से इसे तैनात करने के बजाय, इसे C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll
से तैनात किया जाना चाहिए। फिर अन्य सभी आवश्यक असेंबली भी तैनात की जाती हैं।
तैनाती के क्रम में विधानसभाओं की सूची:
- C: \ Windows \ Microsoft.NET \ फ्रेमवर्क \ v3.0 \ Windows संचार फाउंडेशन \ SMdiagnostics.dll
- C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ System.Web.dll
- C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ System.Messaging.dll
- C: \ Program Files \ संदर्भ विधानसभाओं \ माइक्रोसॉफ्ट \ फ्रेमवर्क \ v3.0 \ System.IdentityModel.dll
- सी: \ प्रोग्राम फ़ाइलें \ संदर्भ असेंबली \ Microsoft \ Framework \ v3.0 \ System.IdentityModel.Selectors.dll
- सी: \ Windows \ Microsoft.NET \ Framework \ v3.0 \ Windows संचार फाउंडेशन \ Microsoft.Transactions .Bridge.dll
क्या आप 32-बिट अप्रबंधित डीएल को 64-बिट सर्वर में लोड करने का प्रयास कर रहे हैं? – GSerg
एक साइड संदर्भ के रूप में, [यह प्रक्रिया से बाहर किया जा सकता है] (http://stackoverflow.com/questions/752357/sql-server-2008-how-crash-safe-is-a-clr-stored- प्रक्रिया-वह-लोड-अप्रबंधित-एल), लेकिन मुझे यकीन है कि यह एक आवश्यकता नहीं है। – GSerg
ठीक है, मुझे इसे किसी भी तरह से करने की ज़रूरत है। हां, 32-बिट अप्रबंधित, मेरा मानना है कि सर्वर 32-बिट है, लेकिन 64-बिट ओएस पर है। मैंने उस पोस्टिंग को देखा। वे विस्तारित संग्रहीत प्रक्रियाओं का उपयोग कर रहे हैं, जिन्हें बहिष्कृत किया जा रहा है। – Ramzay