J'ai eu l'erreur suivante lorsque j'essaye de déployer ma DLL qui fait référence à d'autres ThirdPartyDLL.

Msg 10300, Level 16, State 2, Line 4
Assembly 'MYDLL' references assembly 'ThirdPartyDLL, version=300.1.0.1, culture=neutral, publickeytoken=5c915cbb2b8fbc32.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: version, culture or public key mismatch). Please load the referenced assembly into the current database and retry your request.

J'ai utilisé cette instruction pour déployer ma dll:

USE MYDATABASE
GO

CREATE ASSEMBLY MYDLL
FROM 'C:\Program Files (x86)\MYDLL\MYDLL.dll'
WITH PERMISSION_SET = UNSAFE;
Go

Je suis sûr que ThirdPartyDLL est correctement installé mais j'obtiens la base d'erreur sur la discordance !!! Par exemple résultat de ceci:

SELECT *
FROM sys.assemblies AS a
    INNER JOIN sys.assembly_files AS f ON a.assembly_id = f.assembly_id
FOR JSON PATH

Est:

DLL ERROR

Remarque:

J'ai pu enregistrer MYDLL sur la version suivante de SQL Server:

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) 17 juin 2011 00:57:23 Copyright (c) Microsoft Corporation Standard Edition sur Windows NT 6.1 (Build 7601: Service Pack 1) (WOW64) (Hypervisor)

1
Imran Shamszadeh 25 août 2020 à 12:28

2 réponses

Meilleure réponse

J'ai trouvé la folle raison de ce problème. Base sur les fils suivants:

"Incompatibilité de version, de culture ou de clé publique" de SQL Server lors de la "création de l'assembly" lors du chargement de XMLSerializers créés avec l'utilitaire sgen

Et

https://docs.microsoft.com/en-us/answers/questions/77832/i-got-the-following-error-when-i-try-to-deploy-my.html?sort=votes

Je faisais référence à un assemblage x86 sur un serveur 64 bits. SQL Server n'a pas pu résoudre la référence (en raison d'une architecture incompatible) et installer l'assembly. Cela signifie que vous pouvez installer n'importe quelle DLL (x86 / x64) sur SQL Server 2017, mais juste lorsqu'il n'y a aucune référence. Lorsqu'il existe une DLL référencée, elle doit passer l'architecture SQL Server pour pouvoir la trouver.

Remarque:

Il est possible de changer l'architecture dll de x64 (64 bits) à x86 (32 bits) en utilisant MS CorFlags.exe.

https://docs.microsoft.com/en-us/dotnet/framework/tools/corflags-exe-corflags-conversion-tool

0
Imran Shamszadeh 27 août 2020 à 09:54

Assurez-vous que lorsque vous construisez MYDLL, il est défini sur x86 pour correspondre à l'architecture du processeur ThirdPartyDLL. Je pense qu'il est réglé sur any ou x64, ce qui ne reconnaît donc pas la dll x86. Il semble que MYDLL soit défini sur N'IMPORTE QUEL CPU ou x64 lorsqu'il a été construit, il ne reconnaît pas la version x86 de ThirdPartyDLL

  1. Accédez à l'élément de menu Build> Configuration Manager.
  2. Trouvez votre projet dans la liste, sous Plate-forme, il dira "N'importe quel processeur"
  3. Sélectionnez l'option "Tout CPU" dans la liste déroulante, puis sélectionnez
  4. Dans cette boîte de dialogue, sélectionnez x86 dans la liste déroulante «Nouvelle plate-forme» et assurez-vous que «Tout processeur» est sélectionné dans la liste déroulante «Copier les paramètres de». 5. cliquez sur OK

Remarque: vous souhaiterez sélectionner x86 pour les configurations de débogage et de version.

0
vvvv4d 25 août 2020 à 18:17