При запуске тестового проекта в 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>
Другие вопросы по тегам