При запуске тестового проекта в Dot Net 4.6.1 SQLitePCLRaw выдает исключение TypeInitializationException
У меня есть тестовый проект, ориентированный на net452
, net461
, а также netcoreapp20
. Все отлично работает подnet452
а также netcoreapp20
однако, когда я бегу net461
Я получаю System.TypeInitializationException
вот трассировка стека
Unhandled exception: System.TypeInitializationException: The type initializer for "MyApp.SomeClass" threw an exception. ---> System.ArgumentException: Path is invalid.
in System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
in System.IO.Path.InternalGetDirectoryName(String path)
in SQLitePCL.NativeLibrary.MakePossibilitiesFor(String basename, Assembly assy, Int32 flags, LibSuffix suffix)
in SQLitePCL.NativeLibrary.MyLoad(String basename, Assembly assy, Int32 flags, Action`1 log)
in SQLitePCL.NativeLibrary.Load(String libraryName, Assembly assy, Int32 flags)
in SQLitePCL.Batteries_V2.MakeDynamic(String name, Int32 flags)
in SQLitePCL.Batteries_V2.DoDynamic_cdecl(String name, Int32 flags)
in SQLitePCL.Batteries_V2.Init()
Я проверяю выходные данные моего тестового проекта, и все библиотеки DLL есть, а также SQLite.Interop.dll
в ./x86/
а также ./x64/
Кстати, в моем основном проекте я использую Microsoft.Data.Sqlite и нацелен на net40
, net461
, а также netstandard20
1 ответ
Проблема, похоже, заключается в том, как функция теневого копирования xunit и как SQLitePCLRaw динамически загружает SQLite.Interop.dll
При тестовом запуске xunit создает теневую копию всех DLL и помещает каждую из них в отдельную случайно сгенерированную временную папку, т.е. C:\Users\Administrator\AppData\Local\Temp\4c30a280-0900-4002-874b-a65591ef7c9e\4c30a280-0900-4002-874b-a65591ef7c9e\assembly\dl3\11289531\10e73523_73aed201\Some.dll
Когда SqlitePCLRaw ищет SQLite.interop.dll
во время выполнения он просматривает папку теневых копий, а не свое исходное местоположение.
Решением является создание файла xunit.runner.json
в тестовом проекте и добавьте его в тестовый проект, установив для свойства сборки значение Content
и установив CopyToOutputDirectory на PreserveNewest
В качестве альтернативы, если вы используете несколько вариантов таргетинга и хотите отключить теневое копирование только для net461
вы можете добавить следующее в свой тестовый файл проекта
<ItemGroup Condition="$(TargetFramework) == 'net461'">
<Content Include="$(MSBuildThisFileDirectory)xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>