دي كامپايل كردن اسمبلي هاي CLR
هنگام Deploy كردن پروژه SQL CLR در SQL Server اسمبلي مربوطه در VIEW ي sys.assembly_files ذخيره ميشه.
SELECT * FROM sys.assembly_files
بصورت پيش فرض براي كمك در ديباگ كردن گزينه Deploy Code فعاله و سورس كد شما هم تو ديتابيس ذخيره ميشه.خوب براي ديدن سورس اسمبلي مورد نظر كافيه اونو Cast كنيم به VARCHAR(max) و تمام.
SELECT CAST(content AS VARCHAR(max)) FROM sys.assembly_files
ولي اگه گزينه Deploy Code رو غير فعال كنيم فقط Dll مربوطه تو ديتابيس ذخيره ميشه و …
براي اين مورد كافيه ما Dll رو داشته باشيم و با .NET Reflector به سروس برسيم.
و اما نكته اينه كه چجوري به Dll برسيم بعد سرچ به اين كد رسيدم (CLR Procedure) كه مياد Dll ذخيره شده تو ديتابيس رو داخل ديسك ذخيره ميكنه.
using System; using System.IO; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Security.Permissions; namespace ExtractSqlAssembly { [PermissionSet(SecurityAction.Demand, Unrestricted = true, Name = "FullTrust")] public partial class SaveSqlAssembly { [SqlProcedure] public static void SaveAssembly(string assemblyName, string path) { string sql = @"SELECT AF.content FROM sys.assembly_files AF JOIN sys.assemblies A ON AF.assembly_id = A.assembly_id where AF.file_id = 1 AND A.name = @assemblyname"; using (SqlConnection conn = new SqlConnection("context connection=true")) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { SqlParameter param = new SqlParameter("@assemblyname", SqlDbType.VarChar); param.Value = assemblyName; cmd.Parameters.Add(param); cmd.Connection.Open(); // Read in the assembly byte stream SqlDataReader reader = cmd.ExecuteReader(); reader.Read(); SqlBytes bytes = reader.GetSqlBytes(0); // write the byte stream out to disk FileStream bytestream = new FileStream(path, FileMode.CreateNew); bytestream.Write(bytes.Value, 0, (int)bytes.Length); bytestream.Close(); } } } } }
نظرات
ارسال یک نظر