SQLite.Interop.dll 引用项目需要时,文件不会复制到项目输出路径

SQLite.Interop.dll files does not copy to project output path when required by referenced project

我正在使用 System.Data.SQLite 核心版本:1.0.98.1 nuget 包和 Visual Studio 2015。当我构建引用我的 System.Data.SQLite 包的项目时,它会复制两个文件夹( x86 和 x64) 每个都包含一个 SQLite.Interop.dll 到输出目录。但是,当我构建我的测试项目或引用前面提到的项目的任何其他项目时,这些文件夹不会被复制到父项目的输出目录,并且我在 SQLite.Interop.dll 上收到 DllNotFoundException。

注意:具体是指引用System.Data.SQLite的项目被另一个项目引用

推荐的解决方案 here 是在 packages\System.Data.SQLite.Core.1.0.98.1\build\[你的 System.Data.SQLite.Core.targets.user 中创建一个 System.Data.SQLite.Core.targets.user框架版本在这里]文件夹包含

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup> 
        <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
        <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
        <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
        <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
    </PropertyGroup>
</Project>

但是如果您不想将包文件夹中的任何内容添加到源代码管理中,您可以直接将以下内容添加到您的项目文件中

<PropertyGroup> 
    <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
    <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
    <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
    <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
</PropertyGroup>

SDK 样式项目的更新

在新的 SDK 项目样式中,跨嵌套项目和包解决依赖关系的方式发生了变化。在构建过程中,资产被解析并生成一个 obj\project.assets.json 文件,列出来自所有不同依赖项的资产。然后使用项目资产文件来确定需要导入哪些目标以及需要将哪些文件复制到输出目录。 但是,从非直接依赖项中包含资产的方式有所不同。不导入非直接依赖项的 build 文件夹中的目标文件。旧的解决方法取决于 System.Data.SQLite.Core.targets 导入到父项目中。直接依赖于 System.Data.Sqlite 的项目可以通过将 PrivateAssets="none" 添加到 PackageImport 来覆盖此行为。您还需要将其添加到依赖链中的每个 PackageImport 或 ProjectReference。但是,您不需要将此与之前的解决方法结合使用。

TLDR

在直接引用 System.Data.Sqlite 的项目中将 PrivateAssets="none" 添加到您的 PackageImport

<PackageReference Include="System.Data.SQLite.Core" Version="1.0.112" PrivateAssets="none"/>

对于你的依赖链中的每个项目,直到你的根项目也添加PrivateAssets="none"

<ProjectReference Include="..\MyProject.csproj" PrivateAssets="none"/>

<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles> 似乎对 .NET Standard 2.0 没有影响,其中 SQLite.interop.dll 仍未被识别为引用项目中的内容或依赖项。

我希望有人为此找到更清洁的解决方案...

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard20</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Data.SQLite.Core" Version="1.0.112" GeneratePathProperty="true" />
  </ItemGroup>

  <ItemGroup>
    <!-- Fix to get SQLite.interop.dll copied when using netstandard -->
    <Content Include="$(PkgSystem_Data_SQLite_Core)\runtimes\win-x86\native\netstandard2.0\SQLite.Interop.dll" Link="x86\SQLite.Interop.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="$(PkgSystem_Data_SQLite_Core)\runtimes\win-x64\native\netstandard2.0\SQLite.Interop.dll" Link="x64\SQLite.Interop.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

</Project>