دي كامپايل كردن اسمبلي هاي 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();
                   }
               }
           }
       }
   }

نظرات

پست‌های معروف از این وبلاگ

مقدمه ای بر RavenDB – قسمت دوم

مقدمه ای بر RavenDB – قسمت سوم

lnav ابزاری بسیار کاربردی برای پیمایش لاگ ها در لینوکس و البته مک