我在Xamarin.iOS项目中出现构建错误:
MTOUCH : error MT2101: Can't resolve the reference 'System.String SQLitePCL.raw::sqlite3_errmsg(SQLitePCL.sqlite3)', referenced from the method 'System.String SQLite.SQLite3::GetErrmsg(SQLitePCL.sqlite3)' in 'SQLitePCLRaw.core, Version=1.1.13.388, Culture=neutral, PublicKeyToken=1488e028ca7ab535'. [/Users/[Redacted]/[Redacted]/[Redacted]/src/[Redacted].iOS/[Redacted].iOS.csproj]
在构建日志中,我可以看到使用的SQLitePCLRaw.core版本与csproj中提供的版本不同,即:
LinkerPleaseInclude.cs(179,25): warning CS1702: Assuming assembly reference 'SQLitePCLRaw.core, Version=2.0.1.610, Culture=neutral, PublicKeyToken=1488e028ca7ab535' used by 'SQLite-net' matches identity 'SQLitePCLRaw.core, Version=2.0.2.669, Culture=neutral, PublicKeyToken=1488e028ca7ab535' of 'SQLitePCLRaw.core', you may need to supply runtime policy [/Users/[Redacted]/[Redacted]/[Redacted]/src/[Redacted].iOS/[Redacted].iOS.csproj]
但是,这并不是说降级到1.1.13。当我在LinkerPleaseInclude.cs
中未引用此方法时,根本不会收到此警告。
在我的csproj中,我已设置:
<PackageReference Include="sqlite-net-sqlcipher">
<Version>1.7.302-beta</Version>
</PackageReference>
<PackageReference Include="akavache.sqlite3">
<Version>6.9.10</Version>
</PackageReference>
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlcipher">
<Version>2.0.2</Version>
</PackageReference>
<PackageReference Include="SQLitePCLRaw.core">
<Version>2.0.2</Version>
</PackageReference>
因此,即使我在csproj中将SQLitePCLRaw.core
版本显式设置为2.0.2,编译器也会使用其他版本。如何按照警告中所述供应运行时策略?
答案通常与依赖项有关。我不得不降级它们,并且必须确保兼容性。
当前我使用:
<PackageReference Include="sqlite-net-sqlcipher" Version="1.6.292" />
<PackageReference Include="SQLitePCLRaw.bundle_sqlcipher" Version="1.1.13" />
<PackageReference Include="akavache.sqlite3" Version="6.5.1" />
似乎支持SQLitePCL 1.1.13的最低Akavache是6.5.1,而我一直提供的2.0.2更高的版本甚至使用了错误的版本。