Il semble comme la "référence" est détenue par le domaine App. Vous pouvez essayer de décharger le domaine de l'application qui devrait l'effacer (mieux vaut le deviner car je n'ai aucun moyen de le tester). Vous pouvez le faire en apportant des modifications de sécurité à la base de données. Les travaux suivants:
ALTER DATABASE {db_name} SET TRUSTWORTHY ON (or OFF if already ON);
GO
ALTER DATABASE {db_name} SET TRUSTWORTHY OFF (or ON if already OFF);
GO
Gardez à l'esprit que cela va décharger tous les AppDomains dans cette base de données particulière. Ce n'est généralement pas un problème car les utilisateurs ont rarement plusieurs domaines d'application dans une seule base de données (ce qui nécessiterait que les assemblys soient détenus par des utilisateurs différents, et la plupart des gens utilisent simplement dbo
).
Pour voir ce que App domaines existent et qui sont chargés des ensembles en eux, exécutez ce qui suit:
SELECT DB_NAME(dca.[db_id]) AS [DatabaseName], dca.*, '---' AS [---], dcla.*
FROM sys.dm_clr_appdomains dca
INNER JOIN sys.dm_clr_loaded_assemblies dcla
ON dca.appdomain_address = dcla.appdomain_address
WHERE dca.[db_id] <> 32767;
Si rien est renvoyé par cette requête et vous ne pouvez toujours pas remplacer cette DLL externe, essayez ce qui suit (ce qui semble être un peu beaucoup, mais nous devons savoir si cela fonctionne avant d'essayer quoi que ce soit d'autre):
sp_configure 'clr enabled', 0;
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
RECONFIGURE;
Deux autres options sont à essayer:
Créer une DLL wrapper que vous appelez via DLLImport. Et il appellerait votre Library64.dll
Le dernier recours serait de supprimer de force la DLL non managée avec encore un autre appel non géré. Vous n'avez pas créé la DLL à l'aide de LoadLibrary()
, mais vous devriez pouvoir obtenir une référence en utilisant GetModuleHandleExA()
et en utilisant ce handle dans un appel à FreeLibrary()
. Ceci est décrit dans l'article de blog suivant: PInvoke Library Load/Unload Behavior – Freeing Unmanaged Libraries. Il semble que c'était la seule méthode pour réussir. S'il vous plaît voir @answer de John pour le code spécifique.
Puisque la DLL native est la vôtre, je vous suggère de la réécrire en tant que code managé. Cela vous permettra de charger le code dans SQL Server en tant qu'assemblage au lieu d'une référence externe dangereuse et d'éviter ce problème. –
Je n'aurais pas la vitesse de l'algorithme dans .NET comme je l'ai en C++. – John
https://social.msdn.microsoft.com/Forums/en-US/a2682b53-12ad-4719-b05c-df1476cb39c9/how-to-unload-a-dll?forum=csharpgeneral – lad2025