0

I a déployé avec succès une application Core Console .NET à mon Windows IdO en cours d'exécution sur un Raspberry Pi 3.Entity Framework de base sur Windows IdO en cours d'exécution sur un RPi 3 (Application console)

L'application tire les données d'un webservice et les stocke dans une base de données. J'ai utilisé Entity Framework Core pour cela. Lorsque je démarre l'application de console déployée (.exe) via la PowerShell distante, tout fonctionne sauf l'accès à ma base de données exécutée sur Azure. Lorsque l'application tente de lire à partir de la base de données, il jette l'exception suivante:

System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.TdsParser' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.Data.SqlClient.SNILoadHandle' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'sni.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E) 
    at System.Data.SqlClient.SNINativeMethodWrapper.SNIInitialize(IntPtr pmo) 
    at System.Data.SqlClient.SNILoadHandle..ctor() 
    at System.Data.SqlClient.SNILoadHandle..cctor() 
    --- End of inner exception stack trace --- 
    at System.Data.SqlClient.TdsParser..cctor() 
    --- End of inner exception stack trace --- 
    at System.Data.SqlClient.TdsParser..ctor(Boolean MARS, Boolean fAsynchronous) 
    at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, TimeoutTimer timeout) 
    at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, Boolean redirectedUserInstance) 
    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling) 
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 
    at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 
    at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
    at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
    at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) 
    at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) 
    at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) 
    at System.Data.SqlClient.SqlConnection.Open() 
    at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open() 
    at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.BufferlessMoveNext(Boolean buffer) 
    at Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](Func`2 operation, Func`2 verifySucceeded, TState state) 
    at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, Func`2 operation, TState state) 
    at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.MoveNext() 
    at Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.<_ShapedQuery>d__3`1.MoveNext() 
    at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found) 
    at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) 
    at lambda_method(Closure , QueryContext) 
    at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass20_0`1.<CompileQueryCore>b__0(QueryContext qc) 
    at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query) 
    at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression) 
    at System.Linq.Queryable.First[TSource](IQueryable`1 source) 

Il n'y a pas « sni.dll » dans le dossier de l'application.

Déployé l'application en utilisant le runtime 'win8-arm'.

  • netcoreapp2.0
  • .NET Core 2.0 SDK (Runtime et outillage)

Toutes les idées ce qui ne va pas?

Mise à jour:

Copie du System.Data.SqlClient.dll (lib unix) et en remplaçant celui existant dans le dossier de l'application a résolu le problème. Voir la réponse ci-dessous.

+0

Avez-vous testé votre application sur le bureau? –

+0

J'ai, tout fonctionne avec runtime win10-x64. Je pense qu'il n'y a pas de version ARM de "sni.dll", peu importe ce que c'est .. – FromThe

+0

Quelle est votre version .Net Core? –

Répondre

0

Il n'existe aucune bibliothèque native sni.dll pour ARM. (Voir dotnet/corefx#9064)

J'espérais que je pourrais vous dire comment utiliser la mise en œuvre entièrement gérée de System.Data.SqlClient (celui qui est utilisé sous Linux), mais il utilise malheureusement System.Threading.Thread qui n'est pas disponible sur UWP ...

[Update1]
Attendez, vous n'utilisez pas UWP. :) Essayez d'obtenir l'application pour utiliser %USERPROFILE%.nuget\packages\system.data.sqlclient\4.3.0\runtimes\unix\lib\netstandard1.3\System.Data.SqlClient.dll lors de l'exécution. Il ressemble à System.Data.SqlClient version 4.4.0, il sera entièrement géré par défaut.

+0

Que voulez-vous dire par "utilisation à l'exécution"? Dois-je essayer de charger l'assembly à partir du fichier spécifié? Je vais certainement essayer ça. Le System.Data.SqlClient.dll était déjà dans le dossier de l'application. Pourrait également créer une API Web de repos avec des opérations CRUD de base, ou passer à SQLite qui fonctionne correctement sur .NET Core:/ – FromThe

+0

Copiez sur le fichier 'System.Data.SqlClient.dll' avec celui du répertoire' unix' avant de l'exécuter. – bricelam

+0

Génial, cela a résolu le problème! Merci bricelam! – FromThe