J'appelle une bibliothèque .net standard 2.0 à partir d'un projet de test Framework 4.7.2 avec succès.
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)
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
[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 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
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)
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 ...