0

我成功地部署了.NET的核心控制檯應用程序以我的Windows物聯網在樹莓派3實體框架Core使用RPI 3(控制檯應用程序)

應用程序運行在Windows上運行物聯網從Web服務中提取數據,並將它們存儲在數據庫中。我爲此使用了Entity Framework Core。

當我通過遠程PowerShell啓動部署的控制檯應用程序(.exe)時,除了訪問我在Azure上運行的數據庫以外,其他所有工作都可以使用。當應用程序試圖從數據庫中讀取它拋出以下異常:

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) 

有一個在應用程序文件夾中沒有「sni.dll」。

使用'win8-arm'運行時部署應用程序。

  • netcoreapp2.0
  • .NET核2.0 SDK(運行時和工具)

任何想法有什麼不對?

更新:

複製System.Data.SqlClient.dll(UNIX LIB)和重寫應用程序文件夾中存在的一個問題得到了解決。見下面的答案。

+0

您是否在桌面上測試過您的應用程序? –

+0

我有,一切都適用於運行時win10-x64。我認爲沒有ARM版本的「sni.dll」,無論這是什麼.. – FromThe

+0

什麼是.Net核心版本? –

回答

0

ARM沒有本地sni.dll庫。 (見dotnet/corefx#9064

我希望我能告訴你如何使用的System.Data.SqlClient(這是在Linux上使用的)完全管理的實施,但不幸的是使用System.Threading.Thread這不適用於UWP ...

[Update1]
等一下,你沒有使用UWP。 :)嘗試讓應用程序在運行時使用%USERPROFILE%.nuget\packages\system.data.sqlclient\4.3.0\runtimes\unix\lib\netstandard1.3\System.Data.SqlClient.dll

[Update2]
它看起來像在System.Data.SqlClient版本4.4.0中,默認情況下它將被完全管理。

+0

「你在運行時使用」是什麼意思?我應該嘗試從指定的文件加載程序集嗎?肯定會嘗試。 System.Data.SqlClient.dll已經在應用程序文件夾中。也可以使用基本的CRUD操作構建一個剩餘的Web API,或者切換到在.NET Core上正常工作的SQLite:/ – FromThe

+0

在運行之前,將'System.Data.SqlClient.dll'複製到'unix'目錄中的'System.Data.SqlClient.dll'。 – bricelam

+0

太棒了,這解決了問題!謝謝bricelam! – FromThe

相關問題