O CLR personalizado do SQL Server falha com o erro “Não foi possível carregar o arquivo ou o assembly ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado."

Eu criei um SQL CLR que faz referência à DLL do Windows, WindowsBase. Na maioria das vezes, meu CLR funciona muito bem, mas se o WindowsBase for atualizado no GAC, recebo o erro "Assembly in host store has a different signature than assembly in GAC."

Para resolver isso, criei meu CLR para fazer referência a uma versão do WindowsBase que não está no GAC. Agora, quando executo meu CLR, recebo o erro "Could not load file or assembly 'WindowsBase, Version=4.0.0.0, ...' or one of its dependencies. The system cannot find the file specified."

Eu configurei o FusLogVw para ver o que está acontecendo e obter a seguinte saída

The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\sqlservr.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
    LOG: DisplayName = WindowsBase, Version=4.0.0.0
    LOG: Appbase = file:///C:/Program Files/Microsoft SQL Server/MSSQL11.MSSQLSERVER/MSSQL/Binn/
    LOG: Initial PrivatePath = NULL
    LOG: Dynamic Base = NULL
    LOG: Cache Base = NULL
    LOG: AppName = sqlservr.exe
    Calling assembly : (Unknown).
    ===
    LOG: This bind starts in default load context.
    LOG: No application configuration file found.
    LOG: Using host configuration file: 
    LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
    LOG: Post-policy reference: WindowsBase, Version=4.0.0.0
    LOG: The same bind was seen before, and was failed with hr = 0x80070002.
    ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).

Parece que o carregador de montagem está usando o arquivo machine.config para determinar onde deve procurar a montagem. Com base nessa suposição, atualizei o machine.config com

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
             <assemblyIdentity name="WindowsBase"... />
              <codBase version="4.0.0.0"
                   href="./AdditionalAssemblies/WindowsBase.dll"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

Eu tentei com um caminho relativo (relativo ao SQlservr.exe) e um caminho absoluto, mas continuo recebendo o mesmo erro mencionado acima. Serão muito bem-vindas todas as sugestões sobre como configurar o SQL CLR para que ele faça referência a uma cópia do WindowsBase que esteja fora do GAC sem obter os erros acima.

~ Bugz ~

questionAnswers(1)

yourAnswerToTheQuestion