在Dot Net 4.6.1中测试项目运行时,SQLitePCLRaw抛出TypeInitializationException
When running test project in Dot Net 4.6.1, SQLitePCLRaw throws 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 以及 ./x86/
和 ./x64/
中的 SQLite.Interop.dll
都在那里
顺便说一下我的主要项目,我正在使用 Microsoft.Data.Sqlite 并且目标是 net40
、net461
和 netstandard20
问题似乎与 xunit 卷影复制功能的方式以及 SQLitePCLRaw 动态加载 SQLite.Interop.dll
的方式有关
当测试 运行 xunit 创建所有 DLL 的影子副本并将它们中的每一个放在一个单独的随机生成的临时文件夹中,即 C:\Users\Administrator\AppData\Local\Tempc30a280-0900-4002-874b-a65591ef7c9ec30a280-0900-4002-874b-a65591ef7c9e\assembly\dl3289531e73523_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>
我有一个针对 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 以及 ./x86/
和 ./x64/
SQLite.Interop.dll
都在那里
顺便说一下我的主要项目,我正在使用 Microsoft.Data.Sqlite 并且目标是 net40
、net461
和 netstandard20
问题似乎与 xunit 卷影复制功能的方式以及 SQLitePCLRaw 动态加载 SQLite.Interop.dll
的方式有关
当测试 运行 xunit 创建所有 DLL 的影子副本并将它们中的每一个放在一个单独的随机生成的临时文件夹中,即 C:\Users\Administrator\AppData\Local\Tempc30a280-0900-4002-874b-a65591ef7c9ec30a280-0900-4002-874b-a65591ef7c9e\assembly\dl3289531e73523_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>