2011-12-15 24 views
5

से अप्रबंधित सी/सी ++ डीएलएल कार्यों को कॉल करना मेरे पास सी/सी ++ फ़ंक्शंस की एक विशाल लाइब्रेरी है, जिसे 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
+0

क्या आप 32-बिट अप्रबंधित डीएल को 64-बिट सर्वर में लोड करने का प्रयास कर रहे हैं? – GSerg

+0

एक साइड संदर्भ के रूप में, [यह प्रक्रिया से बाहर किया जा सकता है] (http://stackoverflow.com/questions/752357/sql-server-2008-how-crash-safe-is-a-clr-stored- प्रक्रिया-वह-लोड-अप्रबंधित-एल), लेकिन मुझे यकीन है कि यह एक आवश्यकता नहीं है। – GSerg

+0

ठीक है, मुझे इसे किसी भी तरह से करने की ज़रूरत है। हां, 32-बिट अप्रबंधित, मेरा मानना ​​है कि सर्वर 32-बिट है, लेकिन 64-बिट ओएस पर है। मैंने उस पोस्टिंग को देखा। वे विस्तारित संग्रहीत प्रक्रियाओं का उपयोग कर रहे हैं, जिन्हें बहिष्कृत किया जा रहा है। – Ramzay

उत्तर

1

यहां चर्चा को एकीकृत करना: MSDN - Unmanaged code in SQL CLR। मुझे संदेह है कि यह इंजन के द्वारा डीएलएल को कैसे लोड किया जाता है। वे विकल्पों की एक श्रृंखला प्रस्तुत करते हैं जिसमें एसक्यूएल सर्वर के बाहर कोड को दूसरी सेवा में होस्ट करना और डब्ल्यूसीएफ या शायद COM का उपयोग करके कोड तक पहुंच बनाना शामिल है। अंतिम विकल्प शायद आपके कोड को शुद्ध प्रबंधित सी ++ में पुन: संकलित करना है, लेकिन यह विरासत कोड के लिए एक विकल्प नहीं हो सकता है।

Understanding CLR Integration in SQL Server 2005 प्रक्रिया कैसे काम करती है इस बारे में अधिक जानकारी प्रस्तुत करती है।

To further restrict the code that is allowed to exist and execute inside SQL Server each assembly must be registered with a set of permissions. Three pre-defined sets are available to use; SAFE, EXTERNAL_ACCESS and UNSAFE ...

तुम भी CLR Integration Security समीक्षा करें, और detemrine विश्वास स्तर कोड आप को क्रियान्वित कर रहे हैं के लिए और क्या आप उपयोग वैसे भी CLR प्रक्रिया के भीतर कोड का उपयोग करने के लिए सक्षम हो जाएगा की जरूरत है चाहिए।

+0

धन्यवाद। यह दिलचस्प है, लेकिन वास्तव में एक समाधान की पेशकश नहीं करता है। – Ramzay

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