来自NuGet的System.Data.SQLite,interop dll没有复制到输出目录

时间:2014-11-05 22:03:04

标签: c# .net visual-studio sqlite interop

我安装了System.Data.SQLite Core (x86/x64) from NuGet。它是在没有警告的情况下构建的,但是对System.DllNotFoundException提出了SQLite.Interop.dll。我操纵我的项目将SQLite.Interop.dll从NuGet包的目录下复制到输出目录,现在它运行时没有例外。

为什么NuGet包配置我的项目以将相应的interop dll放在输出目录中?似乎它应该能够做到这一点。

我是interop的新手,我继承了此代码库,该代码库之前直接通过路径引用了System.Data.SQLite.dll。我转而使用NuGet来消除有关项目处理器体系结构与System.Data.SQLite之间不匹配的警告。我试图将所有项目构建为AnyCPU。

10 个答案:

答案 0 :(得分:10)

将其复制到您的项目文件中:

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

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

答案 1 :(得分:6)

就我而言,问题在于我在类库项目中使用SQLite,然后由另一个WPF(gui类型)项目使用。

通过在Project Properties - &gt;中使用以下Post-Build命令解决SQL.Interop.dll没有被复制到输出目录的问题。建立活动:

xcopy "$(SolutionDir)packages\System.Data.SQLite.Core.1.0.101.0\build\net451\x86\SQLite.Interop.dll" "$(OutputDir)" /y /f

/y overwrites
/f displays actual filenames being copied

答案 2 :(得分:5)

我认为这是发生的事情,因为我在部署它们时将文件从输出文件夹复制到另一个位置。我错过了正在复制的互操作文件这一事实,但它们被复制到输出文件夹中的x64和x86文件夹。

如果在项目的debug中运行msbuild,则可以查找对CopySQLiteInteropFiles目标的引用,以确保它正在运行。

答案 3 :(得分:4)

在我的情况下,Nuget没有以任何方式复制SQL.Interop.dll,手动将正确版本的dll放在x86和x64文件夹中解决了这个问题。

如果你已经从Nuget安装了Sqlite,你可以在这个文件夹中找到SQL.Interop.dll(适用于.NET 4.0)

SQLite

答案 4 :(得分:4)

使用 <Grid Width="32" Background="Green"> <Ellipse Width="32" Height="32" Stroke="Red" Fill="White"/> <TextBlock Margin="0,-2,0,0" Text="r" Foreground="Blue" HorizontalAlignment="Center" FontWeight="Bold" VerticalAlignment="Center" FontFamily="Arial" FontSize="28"/> </Grid> NuGet包版本1.0.104,我遇到了与@ Eternal21和@Patrick相同的问题。也就是说,项目A引用SQLite和项目B引用A,其中System.Data.SQLite.Core未复制到B的输出目录中。

我找到了一个解决项目A而不是B的问题的解决方案,这是一个更强大的解决方案,因为它解决了所有未来项目引用A的问题.NuGet包的SQlite.Interop.dll文件包含以下部分:

.targets

此部分添加<ItemGroup Condition="'$(ContentSQLiteInteropFiles)' != '' And '$(ContentSQLiteInteropFiles)' != 'false' And '@(SQLiteInteropFiles)' != ''"> <Content Include="@(SQLiteInteropFiles)"> <Link>%(RecursiveDir)%(FileName)%(Extension)</Link> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> 作为参考,必须将其复制到项目A的输出以及引用项目的输出(如B)。但默认情况下,MSBuild属性SQLite.Interop.dll未定义(我不知道为什么)通过第一个条件禁用引用。为了启用它,我将以下行添加到项目A ContentSQLiteInteropFiles文件的PropertyGroup元素中:

.csproj

请注意,此行必须位于NuGet包的<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles> 文件的Import元素之前。

答案 5 :(得分:2)

在我的情况下,myProject.csproj文件没有定义System.Data.SQLite.Core.targets。我添加了以下行,现在为所有构建目标复制了x64x86 SQLite.Interop.dll版本。

<Import Project="..\packages\System.Data.SQLite.Core.1.0.98.1\build\net45\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.98.1\build\net45\System.Data.SQLite.Core.targets')" />

我不确定当System.Data.SQLite.Core的NuGet包更新以及是否需要手动更改包路径时会发生什么。

答案 6 :(得分:0)

在我的情况下使用NuGet安装SQLite,我仍然需要手动添加SQliteinterop.dll作为资源。然后我建立muy proyect,当我发布它工作正常。 (使用x86配置)

答案 7 :(得分:0)

上面的答案似乎都不适合我,也许是因为我在VS2015上,但这让我感到很有理由为这个问题添加我自己的解决方案。

我的具体情况与@ Eternal21相同 - 我有一个WPF UI正在使用客户端库,这是一个通过nuget添加了SQLite的客户端库。并且,是的,问题是Interop.dll没有被复制到启动应用程序(即没有安装SQLite的WPF UI)。

使用nuget简单地将SQLite添加到WPF项目的解决方案是一个快速简便的解决方案,如果你赶时间。

我稍微苛刻的解决方案使用XCOPY,但确实具有复制x86和x64目录的优势,同时还可以处理Debug和Release版本。它的缺点是它包含硬编码的项目名称。我可以看到你如何使用宏来摆脱第一个,但我不能轻易看到如何摆脱第二个,所以如果项目名称改变你必须手动更改它(但这是相当罕见的)。

我的解决方案是在启动项目的后期构建中使用这些XCOPY命令:

xcopy $(SolutionDir)DALProject\bin\$(ConfigurationName)\x64\SQLite.Interop.dll $(SolutionDir)WPFProject\bin\$(ConfigurationName)\x64\*.* /C /F /S /E /Y
xcopy $(SolutionDir)DALProject\bin\$(ConfigurationName)\x86\SQLite.Interop.dll $(SolutionDir)WPFProject\bin\$(ConfigurationName)\x86\*.* /C /F /S /E /Y

/ C - 即使出现错误也可继续复制(可能不需要)。

/ F - 显示正在复制的文件的完整路径(可以省略以清理构建输出)。

/ S - 复制子目录(这是我创建/ x86和/ x64文件夹的唯一方法)。

/ E - 复制目录和子目录(可能是重复/ S)。

/ Y - 如果目标文件已存在,则禁止提示。

我将此设置为仅在成功构建时运行,它对我有用。希望它可以帮助某人。

答案 8 :(得分:0)

我有一个DLL项目,它使用nuget的SQLite包,但是它的测试项目总是会引发找不到DLL的异常。

我发现最简单的解决方案是将SQLite nuget包添加到测试项目中。

答案 9 :(得分:0)

我添加了

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

在引用nuget包的项目的csproj中。这部分需要位于“ System.Data.SQLite.Core.targets”的“导入”之上。

然后,将以下内容添加到csproj文件中,以便将'SQLite.Interop.dll'的x64版本放置在bin文件夹中。

    <ItemGroup>
        <Content Include="..\packages\System.Data.SQLite.Core.1.0.111.0\build\net46\x64\SQLite.Interop.dll">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </Content>
    </ItemGroup>

尽管在更新nuget软件包时需要更改此语句。