में लोड नहीं होगा हम SQL सर्वर 2005 (32 बिट) की स्थापना में कुछ उपयोगकर्ता परिभाषित कार्यों के साथ एक असेंबली का उपयोग करते हैं। हम इसे इस तरह की एक स्क्रिप्ट के साथ उत्पादन में तैनात करते हैं:सीएलआर असेंबली 64 बिट एसक्यूएल सर्वर 2005
CREATE ASSEMBLY [Ourfunctions]
AUTHORIZATION [dbo]
FROM 0x4D5A9000...000
WITH PERMISSION_SET = SAFE
GO
CREATE FUNCTION [dbo].[GLOBAL_FormatString](@input [nvarchar](4000))
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [Ourfunctions].[UserDefinedFunctions].[GLOBAL_FormatString]
GO
हमने इन कार्यों के साथ कभी भी कोई समस्या नहीं अनुभव की है। अब, जब हमने अपने सर्वरों में से किसी एक को x64 में अपग्रेड करने का प्रयास किया, तो हमें किसी भी फ़ंक्शन को कॉल करते समय त्रुटियां मिलीं। नमूना स्टैक ट्रेस:
System.Data.SqlClient.SqlException: An error occurred in the Microsoft .NET Framework while trying to load assembly id 65549. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error: System.IO.FileLoadException: Could not load file or assembly 'ourfunctions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047) System.IO.FileLoadException: at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean -snip-
त्रुटि का उल्लेख अनुमति सेट EXTERNAL_ACCESS
और UNSAFE
जबकि हम स्तर SAFE
का उपयोग करें।
.dll फ़ाइल लक्ष्य प्लेटफ़ॉर्म के साथ 'किसी भी CPU' पर सेट की गई है और जब हम varbinary वाक्यविन्यास के बजाय फ़ाइल से dll लोड करने का प्रयास करते हैं तो हमें वही परिणाम मिलते हैं। हमने पहले से ही http://support.microsoft.com/kb/918040
में सुझावों का प्रयास किया है हमने 32 बिट मशीन पर सटीक प्रक्रिया की कोशिश की है और सबकुछ अभी काम करता है। यह x86 और x64 के बीच एक अंतर होना चाहिए। कोई विचार?
समाधान: हमें अंततः समाधान मिला। यह पता चला है कि हमारी असेंबली वास्तव में 32 बिट संकलित थी। दृश्य स्टूडियो में, हम लक्ष्य "कोई भी सीपीयू" का इस्तेमाल किया, लेकिन अंतर्निहित .csproj निरीक्षण पर, मैं निम्नलिखित स्निपेट नहीं मिली:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...other elements...
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
इसलिए हमारे "कोई भी सीपीयू" लक्ष्य वास्तव में एक x86 विधानसभा निर्माण किया गया था! Aaargh। मैंने इस लाइन को उपversण में वापस देखा है, लेकिन यह 2006 में पहले चेकइन में पहले से ही था। शायद यह डेटाबेस प्रोजेक्ट के कुछ शुरुआती टेम्पलेट में एक बग था?
वैसे भी, आपकी मदद के लिए धन्यवाद। मैं रसेल के जवाब को स्वीकार करूंगा, क्योंकि मुझे संदेह है कि बहुत से समस्याओं का अनुभव करने वाले बहुत से लोगों को उनके जवाब से मदद मिलेगी।
हमने पहले ही ट्रस्टवॉर्टी विकल्प किया है, इसका उल्लेख KB918040 में किया गया है। हम अन्य विकल्पों को एक कोशिश देंगे। जवाब के लिए धन्यवाद। –