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