web-dev-qa-db-fra.com

Impossible de charger le fichier ou l'assembly 'Microsoft.Data.SqlClient

J'appelle une bibliothèque .net standard 2.0 à partir d'un projet de test Framework 4.7.2 avec succès. references

Si je prends ma dll standard .net 2.0 (SBD.Standard) et crée un nouveau projet winforms qui le référence, on me demande d'ajouter

Microsoft.EntityFrameworkCore, 
then Microsoft.EntityFrameworkCore.SqlServer, 
then Microsoft.Data.SqlClient 

puis mon projet s'exécute avec succès. (Bien que ce serait idéal si les packages supplémentaires étaient ajoutés automatiquement)

enter image description here

Cependant, des problèmes se produisent si j'essaie de distribuer ma bibliothèque via un package Nuget créé à l'aide d'Azure DevOps.

Cependant, lorsque je distribue la bibliothèque standard via Nuget (Utilisation d'Azure DevOps pour créer le Nuget) et que je l'inclus dans un nouveau projet, j'ai une erreur.

La pile d'appels est

System.IO.FileNotFoundException : Could not load file or Assembly 'Microsoft.Data.SqlClient, Version=1.0.19269.1, Culture=neutral, PublicKeyToken=23ec7fc2d6eaa4a5' or one of its dependencies. The system cannot find the file specified.
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.CreateDbConnection()
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.get_DbConnection()
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.CreateCommand(RelationalCommandParameterObject parameterObject, Guid commandId, DbCommandMethod commandMethod)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
   at SBD.Standard.Helpers.HandyFuncs.QueueCommand(ApiDbContext connect, WorkTypeEnum workType, String 

La ligne de code à l'origine du problème est

public static int QueueCommand(ApiDbContext connect, WorkTypeEnum workType, string description, int jobId, int signature, XElement elem)
{
    var command =
        connect.EngineCommandQueues.SingleOrDefault(
            c =>
                (c.Status == 0|| c.Status == 2) &&
                c.Signature == signature);

J'ai trouvé que j'avais besoin d'installer les packages suivants

Microsoft.EntityFrameworkCore 3.1.1
Microsoft.EntityFrameworkCore.SqlServer 3.1.1 which has a dependency on Microsoft.Data.SqlClient >=1.019269.1

Je vois que Microsoft.Data.SQLClient v1.0.19269.1 est installé

J'ai essayé d'installer System.Linq

Je vois la note dans Nuget pour Microsoft.Data.SqlClient

Lors de l'exécution sur Windows, cette bibliothèque a une dépendance sur Microsoft.Data.SqlClient.SNI sur .NET Framework

et installer Microsoft.Data.SqlClient.SNI v1.0.19235.1

J'ai essayé de mettre à niveau Microsoft.Data.SqlClient vers 1.1 et l'erreur est devenue

System.TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.TdsParser' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.SNILoadHandle' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.SNINativeMethodWrapper' threw an exception. ---> System.ComponentModel.Win32Exception: Failed to load C:\Dev2\Combridge\SBD.ComBridge\UnitTestProjectStandard\bin\Debug\x86\SNI.dll ---> System.ComponentModel.Win32Exception: The specified module could not be found
    at Microsoft.Data.SqlClient.SNINativeMethodWrapper..cctor() in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\Interop\SNINativeMethodWrapper.cs:line 64
--- End of inner exception stack trace ---
    at Microsoft.Data.SqlClient.SNINativeMethodWrapper.SNIInitialize()
   at Microsoft.Data.SqlClient.SNILoadHandle..ctor() in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\TdsParserSafeHandles.cs:line 36
   at Microsoft.Data.SqlClient.SNILoadHandle..cctor() in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\TdsParserSafeHandles.cs:line 17
--- End of inner exception stack trace ---
    at Microsoft.Data.SqlClient.TdsParser..cctor() in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\TdsParser.cs:line 166
--- End of inner exception stack trace ---
    at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\ProviderBase\DbConnectionPool.cs:line 1411
   at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\ProviderBase\DbConnectionPool.cs:line 1310
   at Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\ProviderBase\DbConnectionFactory.cs:line 357
   at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\ProviderBase\DbConnectionInternal.cs:line 773
   at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\ProviderBase\DbConnectionClosed.cs:line 72
   at Microsoft.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlConnection.cs:line 1860
   at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlConnection.cs:line 1853
   at Microsoft.Data.SqlClient.SqlConnection.Open() in E:\agent1\_work\31\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlConnection.cs:line 1421
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
   at lambda_method(Closure , QueryContext )
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
   at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)

[Update] Reading This GitHub post il semble que cela pourrait avoir quelque chose à voir avec Azure Devops

Le message mentionne

Win32Exception: Impossible de charger C: __ code_source\repo1\Simplified\bin\x86\SNI.dll Donc, il essaie de charger la version 32 bits de sni.dll et il n'est pas présent.

Cela me fait suspecter que vous le construisez sur un système 64 bits et que vous venez de transférer les fichiers sur l'autre machine. Vous devez publier le projet pour une cible x86 pour obtenir la bonne dépendance native résolue. Essaie.

J'utilise Windows 10 donc je ne vois pas pourquoi il essaierait de charger une version 32 bits de sni.dll

Je peux voir dans Azure Artifiacts

Microsoft.Data.SqlClient.SNI 1.0.19235.1

[Mettre à jour]

Je vois de cette question que je dois forcer MSBuild à créer/mettre à jour un fichier YourProject.dll.config contenant les redirections de liaison nécessaires. Donc Nuget devrait également créer ce fichier de configuration. Je me demande comment cela affecte les choses.

Mon Azure-pipelines.yml est

# .NET Desktop
# Build and run tests for .NET Desktop or Windows classic desktop solutions.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.Microsoft.com/Azure/devops/pipelines/apps/windows/dot-net

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  Major: '2'
  Minor: '0'
  Patch: '0'

steps:
- task: NuGetToolInstaller@0
  inputs:
    versionSpec: '>=4.3.0'
    checkLatest: true

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Major)'
    minorVersion: '$(Minor)'
    patchVersion: '$(Patch)'

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.vbproj'
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Major)'
    minorVersion: '$(Minor)'
    patchVersion: '$(Patch)'

- task: NuGetCommand@2
  displayName: 'NuGet Push'
  inputs:
    command: Push
    publishVstsFeed: 'SBDCommonFeed'
    allowPackageConflicts: true

[Mettre à jour]

J'ai essayé de changer le yaml pour utiliser dotnet pack mais j'obtiens une erreur

error

[Mettre à jour]

J'ai essayé de remplacer la section pack du yaml par

- task: DotNetCoreCLI@2
  inputs:
    command: 'pack'
    selectOrConfig: 'config'
    nugetConfigPath: '$(System.DefaultWorkingDirectory)/NuGet.config'
    externalEndpoints: $(externalFeedCredential)

Maintenant je reçois resource authorization issue Problème d'autorisation de ressource

Lorsque je clique sur le bouton pour autoriser, j'obtiens un message: autorisations insuffisantes ou ressources manquantes. Même si je suis connecté en tant que propriétaire du référentiel.

Je suppose que j'ai besoin d'apprendre quoi mettre dans externalEndpoints

[Mettre à jour]

J'ai essayé ça à la place

- task: DotNetCoreCLI@2
  inputs: 
    command: 'pack'
    outputDir: '$(Build.ArtifactStagingDirectory)/TestDir'

Maintenant l'erreur devient

 error MSB4057: The target "pack" does not exist in the project.

enquêter cette réponse

2
Kirsten Greed

Bien que ce serait idéal si les packages supplémentaires étaient ajoutés automatiquement.

En supposant que nous en ayons un .net standard projet qui dépend de Microsoft.EntityFrameworkCore, Microsoft.EntityFrameworkCore.SqlServer et d'autres packages. Le comportement attendu pour nous est de créer un package nuget dans dont xx.nuspec le fichier a des définitions sur dépendances .

Mais il y a n problème à propos de nuget pack, cela ne fonctionne pas correctement pour le projet .net core/standard. Tous les deux nuget pack et dotnet pack Peut créer .net standard packages nuget avec succès, mais pack successfully ne signifie pas un bon paquet.

Avec l'effet du problème ci-dessus, package créé par nuget pack perdra certaines dépendances dans Package.nuspec fichier. (Renommez xx.nupkg en xx.Zip, puis nous pouvons vérifier le contenu à l'intérieur du package, nous verrons le fichier xx.nuspec )

Et l'étape ci-dessus peut provoquer une erreur d'exécution comme missing Assembly. Donc, pour rendre idéal que les paquets supplémentaires soient ajoutés automatiquement et éviter une référence manquante, nous recommandons dotnet pack commande pour les projets utilisant le format PackageReference. (Peu importe la commande dotnet pack localement ou la tâche dotnet pack dans Azure Devops Piepilne)

2
Lance Li-MSFT

J'ai revu cela récemment et je n'ai pas pu résoudre avec la méthode ci-dessus. J'ai décidé de séparer les projets .netstandard2.0 des projets net472 en différents projets Azure.

Enquête ...

0
Kirsten Greed