我的单元测试套件立即导致测试运行失败,
System.DllNotFoundException: Unable to load DLL 'SQLite.Interop.dll'
这是测试[AssemblyInitialize]
方法中所需的依赖项。
我已经确定这是由执行任何使用
[DeploymentItem]
属性的测试引起的,并且是类或方法的情况。任何不使用此属性的测试都会通过。
在 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>
配置的,所以我想知道是否因为x86与x64的问题而找不到SQLite.Interop.dll
。
<RunSettings>
?SQLite.Interop.dll
?更新
使用
procmon.exe
过滤 testhost.exe
和 SQLite.Interop.dll
我可以看到,没有 [DeploymentItem]
属性的测试开始在项目 bin\Debug
文件夹中查找 dll,该文件夹位于 bin\Debug\x64\SQLite.Interop.dll
。
具有该属性的测试开始在测试结果目录中查找
TestResults\...\Out
,然后在整个机器上查找 C:\Windows
、C:\Program Files
、C:Users
,但不会在 bin\Debug
下进一步查找。
使用
VSTest.Console.exe
运行相同的测试不会出现此问题。
.\Out
目录以进行单元测试?解决;
<DisableAppDomain>True</DisableAppDomain>
,请参阅配置测试运行注意运行设置不能保留在项目或解决方案级别,需要在IDE中设置; https://developercommunity.visualstudio.com/content/problem/151608/ability-to-set-runsettings-in-project-file.html
Dave Anderson 的回答确实有帮助,但是我们将自定义模块加载到 SQLite 中,这导致了“尝试读取或写入受保护的内存”错误。我的解决方法是删除
<DisableAppDomain>True</DisableAppDomain>
并使用
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")]
[DeploymentItem(@"x64\SQLite.Interop.dll", "x64")]
所有需要使用 SQLite 的测试或类