Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Method not found in target type: Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools() #4446

Open
DoubleDBE opened this issue Mar 10, 2024 · 4 comments

Comments

@DoubleDBE
Copy link

When using the latest version of Microsoft.Data.Sqlite (8.0.2), the following exception occurs when running my app in Release mode on Android. Not sure if it's Android specific, but i'll mention it anyway.

When downgrading to Microsoft.Data.Sqlite 7.0.16, the issue is resolved.

System.Reflection.TargetInvocationException: Arg_TargetInvocationException
 ---> LinqToDB.LinqToDBException: Method not found in target type: Microsoft.Data.Sqlite.SqliteConnection.ClearAllPools()
   at LinqToDB.Expressions.TypeMapper.<>c.<ReplaceTypes>b__27_0(ReplaceTypesContext context, Expression e)
   at LinqToDB.Expressions.TransformVisitor`1[[LinqToDB.Expressions.TypeMapper.ReplaceTypesContext, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a]].Transform(Expression expr)
   at LinqToDB.Expressions.ExpressionExtensions.Transform[ReplaceTypesContext](Expression expr, ReplaceTypesContext context, Func`3 func)
   at LinqToDB.Expressions.TypeMapper.ReplaceTypes(Expression expression, ReplaceTypesContext ctx)
   at LinqToDB.Expressions.TypeMapper.MapLambdaInternal(LambdaExpression lambda, Boolean mapConvert, Boolean convertResult, Boolean ignoreMissingMembers)
   at LinqToDB.Expressions.TypeMapper.MapActionLambda(Expression`1 action)
   at LinqToDB.DataProvider.SQLite.SQLiteProviderAdapter.CreateAdapter(String assemblyName, String clientNamespace, String prefix)
   at LinqToDB.DataProvider.SQLite.SQLiteProviderAdapter.GetInstance(String name)
   at LinqToDB.DataProvider.SQLite.SQLiteDataProvider..ctor(String name, MappingSchema mappingSchema)
   at LinqToDB.DataProvider.SQLite.SQLiteDataProvider..ctor(String name)
   at LinqToDB.DataProvider.SQLite.SQLiteDataProviderMS..ctor()
   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Constructor(Object obj, IntPtr* args)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object , BindingFlags )
   Exception_EndOfInnerExceptionStack
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object , BindingFlags )
   at System.RuntimeType.CreateInstanceMono(Boolean , Boolean )
   at System.RuntimeType.CreateInstanceOfT()
   at System.Activator.CreateInstance[SQLiteDataProviderMS]()
   at LinqToDB.Data.DataConnection.<>c__43`1[[LinqToDB.DataProvider.SQLite.SQLiteDataProviderMS, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a]].<CreateDataProvider>b__43_0()
   at System.Lazy`1[[LinqToDB.DataProvider.IDataProvider, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a]].ViaFactory(LazyThreadSafetyMode )
   at System.Lazy`1[[LinqToDB.DataProvider.IDataProvider, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a]].ExecutionAndPublication(LazyHelper , Boolean )
   at System.Lazy`1[[LinqToDB.DataProvider.IDataProvider, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a]].CreateValue()
   at System.Lazy`1[[LinqToDB.DataProvider.IDataProvider, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a]].get_Value()
   at LinqToDB.DataProvider.SQLite.SQLiteTools.ProviderDetector(ConnectionOptions options)
   at LinqToDB.Data.DataConnection.ConfigurationInfo.<>c__DisplayClass12_0.<GetDataProvider>b__0(Func`2 d)
   at System.Linq.Enumerable.SelectListIterator`2[[System.Func`2[[LinqToDB.Data.ConnectionOptions, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a],[LinqToDB.DataProvider.IDataProvider, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[LinqToDB.DataProvider.IDataProvider, linq2db, Version=5.4.0.0, Culture=neutral, PublicKeyToken=e41013125f9e410a]].MoveNext()
   at System.Linq.Enumerable.TryGetFirst[IDataProvider](IEnumerable`1 , Func`2 , Boolean& )
   at System.Linq.Enumerable.FirstOrDefault[IDataProvider](IEnumerable`1 source, Func`2 predicate)
   at LinqToDB.Data.DataConnection.ConfigurationInfo.GetDataProvider(ConnectionOptions options, Boolean isGlobal)
   at LinqToDB.Data.DataConnection.GetDataProvider(String providerName, String connectionString)
   at LinqToDB.Data.DataConnection.GetDataProviderEx(String providerName, String connectionString)
   at LinqToDB.Data.DataConnection.ConfigurationApplier.Apply(DataConnection dataConnection, ConnectionOptions options)
   at LinqToDB.Data.ConnectionOptions.LinqToDB.Common.IApplicable<LinqToDB.Data.DataConnection>.Apply(DataConnection obj)
   at LinqToDB.DataOptions.Apply(DataConnection dataConnection)
   at LinqToDB.Data.DataConnection..ctor(DataOptions options)

Environment details

The following properties are set within the csproj if needed:

<PropertyGroup Condition="'$(Configuration)' == 'Release'">

	<RuntimeIdentifiers>android-arm;android-arm64</RuntimeIdentifiers>

	<RunAOTCompilation>true</RunAOTCompilation>
		
	<AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
		
</PropertyGroup>

Linq To DB version: 5.4.0

Database (with version): Sqlite

ADO.NET Provider (with version): Microsoft.Data.Sqlite 8.0.2

Operating system: Android, probably others too

.NET Version: .NET 8

@MaceWindu
Copy link
Contributor

Method is still here in v8, so I assume microsoft marked v8 as trimmable and it was removed by AOT compilation as not used. You need to configure your AOT compilation to preserve this method.

@DoubleDBE
Copy link
Author

DoubleDBE commented Mar 11, 2024

@MaceWindu you're right.

Solved it by adding the following to the android csproj file.

Should I consider this as a temporary workaround or should I keep it?

<ItemGroup Condition="'$(Configuration)' == 'Release'">
	<TrimmerRootAssembly Include="Microsoft.Data.Sqlite" RootMode="Library"  />
</ItemGroup>

@MaceWindu
Copy link
Contributor

For now keep it. We still need to decide what to do with AOT support as it is quite a big task taking into account amount of reflection we use.

@DoubleDBE
Copy link
Author

Okay thanks for the feedback! I'll keep it in for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

No branches or pull requests

2 participants