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 的问题而找不到。

更新

testhost.exeSQLite.Interop.dll使用procmon.exe过滤我可以看到没有[DeploymentItem]属性的测试开始在项目bin\Debug中寻找dll在 bin\Debug\x64\SQLite.Interop.dll 找到它的文件夹。

那些具有属性的测试开始在测试结果目录 TestResults\...\Out 中查找,然后在整个计算机 C:\WindowsC:\Program FilesC:Users 中查找,但再也不会在 bin\Debug.

运行同样的测试使用VSTest.Console.exe没有这个问题。

解决;

  1. Configure unit tests by using a .runsettings file
  2. 添加设置 <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

的测试或 类 上