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 ~