CLR SQL Assembly: получить байтовый поток?

У меня есть DLL-библиотека SQL CLR, которую я хочу развернуть, но обнаружил, что вы можете встроить биты потока байтов/varbinary_literal/varbinary_expression/assembly в текстовый файл, чтобы обойти беспорядочную упаковку DLL и убедиться, что она доступна для команда CREATE ASSEMBLY.

Но мне еще предстоит найти, как получить значение байтового потока/varbinary_literal/varbinary_expression/assembly bits. Я не нашел единообразной терминологии, и то, что я продолжаю находить при использовании Load().


person OMG Ponies    schedule 21.05.2010    source источник
comment
ВЫБЕРИТЕ @assemblyBinary = AF.content FROM sys.assemblies КАК ВНУТРЕННЕЕ СОЕДИНЕНИЕ sys.assembly_files AS AF ON A.assembly_id = AF.assembly_id WHERE A.name = 'Assembly_CLRFunction'   -  person Mohammad Afrashteh    schedule 13.04.2018
comment
Я бы сказал, что правильной терминологией будет шестнадцатеричная строка.   -  person Matthias Güntert    schedule 31.01.2020


Ответы (2)


Это просто шестнадцатеричное представление dll. Этот бит должен помочь:

    static string GetHexString(string assemblyPath)
    {
        if (!Path.IsPathRooted(assemblyPath))
            assemblyPath = Path.Combine(Environment.CurrentDirectory, assemblyPath);

        StringBuilder builder = new StringBuilder();
        builder.Append("0x");

        using (FileStream stream = new FileStream(assemblyPath,
              FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            int currentByte = stream.ReadByte();
            while (currentByte > -1)
            {
                builder.Append(currentByte.ToString("X2", CultureInfo.InvariantCulture));
                currentByte = stream.ReadByte();
            }
        }

        return builder.ToString();
    }

Вы должны использовать полученную строку следующим образом:

string hexString = GetHexString(assemblyPath);
string sql = "CREATE ASSEMBLY [" + assemblyName + "] FROM " + hexString + 
             " WITH PERMISSION_SET = " + somePermissionSet;
person Sander Rijken    schedule 21.05.2010
comment
Спасибо - шестнадцатеричная информация привела меня к этому коду: blog.waldenl.com/2009/12/ - person OMG Ponies; 23.05.2010
comment
это в основном тот же цикл, да :) - person Sander Rijken; 30.05.2010

Найдено здесь, varbinary можно сгенерировать без специального кода для его создания, только с помощью SQL Server Management Studio (SSMS) и локальный экземпляр SQL Server.

  1. create или alter вашу сборку в вашей базе данных, используя ее локальный путь на вашем локальном сервере SQL.

    use yourBase
    go
    create assembly YourAssemblySqlName from N'YourLocalPath\YourAssemblyFile.dll'
    go
    
  2. Перейдите к своей сборке в обозревателе объектов.

    Переход к сборке

  3. Скрипт его создания.

    Сценарий сборки

И SSMS дает вам varbinary.

person Frédéric    schedule 01.04.2016
comment
Вы также можете получить это так: SELECT af.content FROM sys.assemblies a INNER JOIN sys.assembly_files af ON a.assembly_id = af.assembly_id WHERE a.name = <@assemblyName> - person rahvin_t; 28.11.2016