2014-11-05 139 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包添加到測試項目中。