MSTest DeploymentItem 属性导致 SQLite.Interop.dll 未找到
MSTest DeploymentItem attribute causes SQLite.Interop.dll not found
我的单元测试套件立即未能通过测试 运行 和 System.DllNotFoundException: Unable to load DLL 'SQLite.Interop.dll'
,这是测试 [AssemblyInitialize]
方法中所需的依赖项。
我确定这是由执行任何使用 [DeploymentItem]
属性的测试引起的,并且是 class 或方法的情况。任何不使用此属性的测试都会通过。
在 VS2019 中启用测试诊断日志记录后,没有明显的错误,但我可以看到此配置。
<RunSettings>
<RunConfiguration>
<ResultsDirectory>D:\Dev\****\src\TestResults</ResultsDirectory>
<SolutionDirectory>D:\Dev\****\src\</SolutionDirectory>
<TargetPlatform>X86</TargetPlatform>
<CollectSourceInformation>False</CollectSourceInformation>
</RunConfiguration>
</RunSettings>
我的测试项目都是为 <PlatformTarget>AnyCPU</PlatformTarget>
配置的,所以我想知道 SQLite.Interop.dll
是否因为 x86 与 x64 的问题而找不到。
- 我在哪里可以配置
<RunSettings>
?
- 为什么
SQLite.Interop.dll
找不到?
更新
对testhost.exe
和SQLite.Interop.dll
使用procmon.exe
过滤我可以看到没有[DeploymentItem]
属性的测试开始在项目bin\Debug
中寻找dll在 bin\Debug\x64\SQLite.Interop.dll
找到它的文件夹。
那些具有属性的测试开始在测试结果目录 TestResults\...\Out
中查找,然后在整个计算机 C:\Windows
、C:\Program Files
、C:Users
中查找,但再也不会在 bin\Debug
.
运行同样的测试使用VSTest.Console.exe
没有这个问题。
- 如何将 System.Data.SQLite from NuGet, interop dll not copied to output directory 应用到
.\Out
目录以进行单元测试?
解决;
- Configure unit tests by using a .runsettings file
- 添加设置
<DisableAppDomain>True</DisableAppDomain>
,参见 Configure a test run
注意运行设置不能在项目或解决方案级别保留,需要在IDE中设置; https://developercommunity.visualstudio.com/content/problem/151608/ability-to-set-runsettings-in-project-file.html
确实有帮助,但是我们将自定义模块加载到 SQLite 中,这导致了 'Attempted to read or write protected memory' 错误。我的解决方法是删除 <DisableAppDomain>True</DisableAppDomain>
并使用
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")]
[DeploymentItem(@"x64\SQLite.Interop.dll", "x64")]
在所有需要使用 SQLite
的测试或 类 上
我的单元测试套件立即未能通过测试 运行 和 System.DllNotFoundException: Unable to load DLL 'SQLite.Interop.dll'
,这是测试 [AssemblyInitialize]
方法中所需的依赖项。
我确定这是由执行任何使用 [DeploymentItem]
属性的测试引起的,并且是 class 或方法的情况。任何不使用此属性的测试都会通过。
在 VS2019 中启用测试诊断日志记录后,没有明显的错误,但我可以看到此配置。
<RunSettings>
<RunConfiguration>
<ResultsDirectory>D:\Dev\****\src\TestResults</ResultsDirectory>
<SolutionDirectory>D:\Dev\****\src\</SolutionDirectory>
<TargetPlatform>X86</TargetPlatform>
<CollectSourceInformation>False</CollectSourceInformation>
</RunConfiguration>
</RunSettings>
我的测试项目都是为 <PlatformTarget>AnyCPU</PlatformTarget>
配置的,所以我想知道 SQLite.Interop.dll
是否因为 x86 与 x64 的问题而找不到。
- 我在哪里可以配置
<RunSettings>
? - 为什么
SQLite.Interop.dll
找不到?
更新
对testhost.exe
和SQLite.Interop.dll
使用procmon.exe
过滤我可以看到没有[DeploymentItem]
属性的测试开始在项目bin\Debug
中寻找dll在 bin\Debug\x64\SQLite.Interop.dll
找到它的文件夹。
那些具有属性的测试开始在测试结果目录 TestResults\...\Out
中查找,然后在整个计算机 C:\Windows
、C:\Program Files
、C:Users
中查找,但再也不会在 bin\Debug
.
运行同样的测试使用VSTest.Console.exe
没有这个问题。
- 如何将 System.Data.SQLite from NuGet, interop dll not copied to output directory 应用到
.\Out
目录以进行单元测试?
解决;
- Configure unit tests by using a .runsettings file
- 添加设置
<DisableAppDomain>True</DisableAppDomain>
,参见 Configure a test run
注意运行设置不能在项目或解决方案级别保留,需要在IDE中设置; https://developercommunity.visualstudio.com/content/problem/151608/ability-to-set-runsettings-in-project-file.html
<DisableAppDomain>True</DisableAppDomain>
并使用
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")]
[DeploymentItem(@"x64\SQLite.Interop.dll", "x64")]
在所有需要使用 SQLite