我安装了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。
答案 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
。我添加了以下行,现在为所有构建目标复制了x64
和x86
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软件包时需要更改此语句。