2014-11-05 140 views
11

我安装了System.Data.SQLite Core (x86/x64) from NuGet。它没有警告地构建,但是投掷System.DllNotFoundException关于SQLite.Interop.dll。我操纵我的项目,将NuGet软件包目录下的SQLite.Interop.dll复制到输出目录,现在它运行时没有出现异常。来自NuGet的System.Data.SQLite,interop dll没有复制到输出目录

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

我是新来interop,我继承这个代码库,它以前直接通过路径引用System.Data.SQLite.dll。我切换到NuGet以摆脱有关项目的处理器架构与System.Data.SQLite之间不匹配的警告。我正在尝试将所有项目构建为AnyCPU。

回答

4

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

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

+0

有趣的是,我看到他们在那里。那么,它将它们复制到在运行时无法找到的地方?我想知道它是否适用于机器特定的版本。我尝试了x86和x64版本,但有错误。可能是我的一个问题,不确定。 – Vimes 2014-11-11 17:49:21

+0

*在运行时发现*。如果我删除这些文件夹,则会出现加载错误。如果我不这样做,它会起作用。我只发现这一点,因为我是从输出目录复制文件到另一个位置运行,而我没有复制子目录。 – Richard 2014-11-12 13:39:16

+3

不适合我。我在运行时遇到了DllNotFoundException。您的所有项目都是以AnyCPU的形式构建的吗? – Vimes 2014-11-12 18:59:45

4

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

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

PROJECT_FOLDER\packages\System.Data.SQLite.Core.1.0.*.*\build\net40

+0

同样的问题。 Nuget不会将SQLite.Interop.dll添加到输出文件夹。必须通过使用后生成事件将它放置在那里。 – Eternal21 2016-05-17 15:55:01

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')" /> 

我不知道当NuGet包为System.Data.SQLite.Core更新,并且如果包路径将需要手动更改会发生什么。

5

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

解决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 
0
使用的NuGet安装的SQLite我的情况

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

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 - 如果目标文件已存在,则禁止提示。

我设置它只在成功构建时运行,它对我来说是一种享受。希望它能帮助别人。

2

随着System.Data.SQLite.Core NuGet软件包版本1.0.104,我有@ Eternal21和@Patrick相同的问题。也就是说,项目A引用了SQLite和项目B引用A,其中SQlite.Interop.dll未被复制到B的输出目录中。

我找到了一个解决方案,解决了项目A中的问题,而不是B,因为它是更强大的解决方案解决了这个问题一次指的答:.targets文件的NuGet包均包含以下部分的所有未来项目:

<ItemGroup Condition="'$(ContentSQLiteInteropFiles)' != '' And 
         '$(ContentSQLiteInteropFiles)' != 'false' And 
         '@(SQLiteInteropFiles)' != ''"> 
    <Content Include="@(SQLiteInteropFiles)"> 
    <Link>%(RecursiveDir)%(FileName)%(Extension)</Link> 
    <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
    </Content> 
</ItemGroup> 

本节增加了SQLite.Interop.dll作为具有被复制到项目A的输出,并还可以参考引用项目的输出(如B)。但MSBuild属性ContentSQLiteInteropFiles是默认未定义的(我不知道为什么)通过第一个条件禁用引用。要启用它,我添加了以下行项目的.csproj文件的PropertyGroup元素:

<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles> 

请注意,这条线一定prececde的Import元素为.targets文件NuGet包的。

+0

谢谢!这解决了我的问题。 – 2017-11-08 13:31:16

0

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

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