RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1099922
Accepted
Mikhail
Mikhail
Asked:2020-03-26 13:33:00 +0000 UTC2020-03-26 13:33:00 +0000 UTC 2020-03-26 13:33:00 +0000 UTC

如何找出 CLR 函数的底层内容

  • 772

我维护的服务器有很多 CLR 对象。这是我第一次遇到他们。也许它们不能正常工作,需要优化。没有来源。我怎样才能找到这些对象的代码?它们可能是用 c# 编写的。我试图运行分析器,但除了“EXEC 'Clr 对象的名称'”之外,我没有在那里看到它。据我了解,我们正在谈论反汇编 DLL 文件?

sql-server
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MSDN.WhiteKnight
    2020-03-26T18:32:52Z2020-03-26T18:32:52Z

    SQLCLR 函数可以由单个编译的 DLL 表示,也可以由具有源代码的 DLL 表示,如果它以这种方式填充(据我所知,这是标准项目模板所做的)。功能列表可索取

    select * from sys.assembly_modules
    

    这将返回如下内容:

    object_id   assembly_id     assembly_class          assembly_method ...
    1573580644  65551           UserDefinedFunctions    Func1           ...
    1589580701  65551           UserDefinedFunctions    Func2           ...
    

    assembly_id指向包含函数代码的程序集。可以通过查询sys.assemblies系统表来获得程序集。与程序集对应的文件存储在sys.assembly_files中。

    您可以使用ICSharpCode.Decompiler库从已编译的程序集中提取 C# 代码。

    显示文件列表的请求示例:

    SELECT assemblies.name, 
     assemblies.assembly_id, 
     assembly_files.name as "filename"
    FROM sys.assemblies
    INNER JOIN sys.assembly_files  ON assemblies.assembly_id = assembly_files.assembly_id 
    

    C#输出指定程序集的所有文件的代码示例:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.SqlClient;
    using System.Text;
    using ICSharpCode.Decompiler;
    using ICSharpCode.Decompiler.CSharp;
    
    class SqlClrAssFile
    {
        public string Name { get; set; }
        public byte[] Data { get; set; }
    }
    
    class Program
    {
    
        public static IEnumerable<SqlClrAssFile> GetAssemblyFiles(string assname)
        {
            SqlConnectionStringBuilder build = new SqlConnectionStringBuilder();
            build.DataSource = "SERVER";
            build.InitialCatalog = "mydb";
    
            SqlConnection conn = new SqlConnection(build.ConnectionString);
            List<SqlClrAssFile> files = new List<SqlClrAssFile>();
    
            using (conn)
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(
                    "SELECT assembly_files.name as filename,content FROM sys.assemblies "+
                    " INNER JOIN sys.assembly_files ON assemblies.assembly_id = assembly_files.assembly_id " +
                    " WHERE assemblies.name=@name", conn);
                cmd.Parameters.AddWithValue("name", assname);
                SqlDataReader rd = cmd.ExecuteReader();
    
                using (rd)
                {
                    while (true)
                    {
                        if (rd.Read() == false) break;
                        SqlClrAssFile file = new SqlClrAssFile();
                        file.Name = (string)rd["filename"];
                        file.Data = (byte[])rd["content"];
                        files.Add(file);
                    }
    
                    return files;
                }
            }        
        }
    
        static void Main(string[] args)
        {
            IEnumerable<SqlClrAssFile> files = GetAssemblyFiles("MyClrAssembly");
    
            foreach (var x in files)
            {
                Console.WriteLine("*****"+x.Name+ "*****");
                string ext = Path.GetExtension(x.Name);
    
                if (ext == ".cs")
                {
                    //показать файл исходников
                    Console.WriteLine(Encoding.UTF8.GetString(x.Data));
                }
                else if (ext == ".dll" || ext == "")
                {
                    try
                    {
                        //показать декомпилированную DLL
                        string name = Path.GetFileName(x.Name);
                        File.WriteAllBytes(name, x.Data);
                        CSharpDecompiler decompiler = new CSharpDecompiler(name, new DecompilerSettings());
    
                        Console.WriteLine("[Decompiled]");
                        Console.WriteLine(decompiler.DecompileWholeModuleAsString());                    
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }
                }
                else
                {
                    Console.WriteLine("[Unknown file: {0} bytes]",x.Data.Length);
                }
            }
    
            Console.ReadKey();
        }
    }
    
    

    在这里,我们简单地将字节转换为 .cs 文件的文本,对于 DLL,我们将它们转储到文件中并进行反编译。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5