引用含System.Data.SQLite的DLL加载SQLite.Interop.dll异常问题
跨项目引用下SQLite.Interop.dll未自动输出的配置操作
此前在类库A项目中设置的“SQLite.Interop.dll始终复制到输出目录”规则,仅对A项目自身的编译输出生效。当可执行程序B引用A项目时,Visual Studio 默认的引用传递逻辑会自动过滤非程序集类型的附属关联文件,因此不会把SQLite.Interop.dll同步到B的输出目录。
以下是需要完成的额外配置:
- 调整A项目中SQLite.Interop.dll的目录结构
不要将不同平台的SQLite.Interop.dll直接平铺在项目根目录,按照System.Data.SQLite的标准目录结构放置:- 32位版本文件路径:
项目根目录/runtimes/win-x86/native/SQLite.Interop.dll - 64位版本文件路径:
项目根目录/runtimes/win-x64/native/SQLite.Interop.dll
对两个路径下的SQLite.Interop.dll,将文件属性设置为内容,复制到输出目录选项选择始终复制。
- 32位版本文件路径:
- 给A项目添加跨项目文件传递标记
打开A项目的.csproj编辑视图,在<ItemGroup>节点下添加如下配置,显式标记SQLite.Interop.dll为可跨项目传递的内容文件:<ItemGroup> <Content Include="runtimes\**\SQLite.Interop.dll"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToPublishDirectory>Always</CopyToPublishDirectory> </Content> </ItemGroup> - 修改B项目对A的引用配置
打开B项目的.csproj编辑视图,找到对A项目的引用节点,添加PrivateAssets="none"属性,确保引用A时,A关联的所有附属文件不会被自动过滤:<ProjectReference Include="类库A的项目路径"> <Private>true</Private> <PrivateAssets>none</PrivateAssets> </ProjectReference> - 校验配置有效性
依次重新编译类库A和可执行程序B,检查B的输出目录下是否生成与A项目结构一致的runtimes目录、是否存在对应平台的SQLite.Interop.dll。如果是发布场景,需在B的发布配置中勾选包含所有引用的程序集,避免发布流程过滤掉Interop文件。
内容的提问来源于stack exchange,提问作者jzian
相关产品推荐
相关产品推荐

