簡體   English   中英

無法加載 DLL“SQLite.Interop.dll”

[英]Unable to load DLL 'SQLite.Interop.dll'

我定期收到以下異常:

Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

我正在使用 1.0.82.0。 版本,在 VS2010,操作系統 Win7 64 中使用 nuget 安裝它。

一旦異常開始出現,它就會不斷出現——在 VS 內部或外部的調試、發布和運行應用程序中。

停止它的唯一方法是注銷和登錄。 不拋出異常並加載 dll。 它可以工作幾天,但隨后可能會再次損壞。

有沒有人見過這樣的事情,有解決辦法嗎?

我知道我參加聚會遲到了,但是在我今天下載最新的 x86/x64(版本 1.0.88.0)之后,我就遇到了這個問題。 我在 VS2012 中的本地 IIS 默認運行 32 位,並且沒有簡單的方法可以切換到 x64。 我的生產服務器運行 64 位。

無論如何,我將 NuGet 包安裝到 DLL 項目中,但出現此錯誤。 我必須做些什么才能讓它工作,我也必須將它安裝到主站點項目中。 即使它根本不涉及 SQLite 類。

我的猜測是 SQLite 使用入口程序集來檢測要加載哪個版本的互操作。

我遇到這個問題是因為我使用的 dll 將 Sqlite 作為依賴項(在 NuGet 中僅配置了 Sqlite 核心包。)。 該項目編譯並復制除“SQLite.Interop.dll”(x86 和 x64 文件夾)之外的所有 Sqlite dll。

解決方案非常簡單:只需將 System.Data.SQLite.Core 包作為依賴項(使用 NuGet)添加到您正在構建/運行的項目中,並且 dll-s 將被復制。

因此,在添加 NuGet 之后,部署不會復制互操作。 您可以將其添加到您的 csproj 文件中,它應該可以修復該行為:

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

如果您查看 NuGet for SQLite 的源代碼,您可以看到它們具體在做什么。 這使我能夠使用 ASP.Net Core 進行部署。

在平台目標為Any CPU的 WPF 項目中使用 SQLite 時,我遇到了同樣的問題。 我按照以下步驟修復了它:

  1. 在 Visual Studio 中打開項目設計器。 可以在此處找到有關如何操作的詳細信息。
  2. 單擊構建選項卡。
  3. 禁用prefer 32-bit選項。

或者,您可以將平台目標設置為x86x64 我認為這個問題是由System.Data.SQLite庫使用平台目標來獲取“SQLite.Interop.dll”文件的位置引起的。

更新:

如果無法聯系到項目設計者,只需從文本編輯器打開項目 ( *.csproj ) 文件並將值<Prefer32Bit>false</Prefer32Bit><PropertyGroup>...</PropertyGroup>標記中。

示例代碼

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>[Set by Visual Studio]</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>[Set by Visual Studio]</RootNamespace>
    <AssemblyName>[Set by Visual Studio]</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>[Set by Visual Studio]</FileAlignment>
    <!--Add the line below to your project file. Leave everything else untouched-->
    <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>

這就是我在我的項目中修復它的方式。

它正在工作,當一位同事提交他的更改時,我收到了“無法加載 DLL 'SQLite.Interop.dll'”異常。

比較項目的 .csproj 文件,這是在非工作版本中:

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll" />
     <Content Include="x86\SQLite.Interop.dll" />
</ItemGroup>

這就是 WORKING 版本所具有的:

<ItemGroup>
     <Content Include="x64\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
      <Content Include="x86\SQLite.Interop.dll">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
</ItemGroup>

恢復后,我沒有收到異常。 DLL 文件被轉儲到相應的 Debug\\x64 (etc) 文件夾中。

當您進入此狀態時,請嘗試執行 Rebuild-All。 如果這解決了問題,您可能會遇到與我相同的問題。

一些背景(我的理解)

  • SQLite 有 1 個托管程序集 (System.Data.SQLite.dll) 和幾個特定於平台的程序集 (SQLite.Interop.dll)。 使用 Nuget 安裝 SQLite 時,Nuget 會將特定於平台的程序集添加到您的項目(在幾個文件夾中:\\x86、\\x64),並將這些 dll 配置為“始終復制”。

  • 加載時,托管程序集將在 \\x86 和 \\x64 文件夾中搜索特定於平台的程序集。 您可以在此處了解更多信息 例外是這個托管程序集試圖在這些文件夾中找到相關的(SQLite.Interop.dll)(並且失敗)。

我的場景

我的解決方案中有 2 個項目; 一個 WPF 應用程序和一個類庫。 WPF 應用程序引用類庫,類庫引用 SQLite(通過 Nuget 安裝)。

我的問題是當我只修改 WPF 應用程序時,VS 嘗試進行部分重建(意識到依賴的 dll 沒有改變)。 在此過程中,VS 會清除 \\x86 和 \\x64 文件夾的內容(清除 SQLite.Interop.dll)。 當我進行完整的 Rebuild-All 時,VS 會正確復制文件夾及其內容。

我的解決方案

為了解決這個問題,我最終添加了一個使用 xcopy 的 Post-Build 過程來強制將 \\x86 和 \\x64 文件夾從類庫復制到我的 WPF 項目 \\bin 目錄。

或者,您可以使用構建配置/輸出目錄做更有趣的事情。

我在運行 Visual Studio Express 2013 時遇到了同樣的問題。我嘗試了這里和其他地方提到的幾種解決方案,但無濟於事。 我希望這個修復可以幫助其他人。

我通過在測試基於 SQLite 的服務的測試類上使用DeploymentItem屬性來修復它。

例子:

[TestClass]
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")] // this is the key
public class LocalStoreServiceTests
{

    [TestMethod]
    public void SomeTestThatWasFailing_DueToThisVeryIssue()
    {
         // ... test code here
    }
}

這會導致所需的SQLite.Interop.dll被復制到適當的“TestResults”文件夾中的x86目錄。

一切都是綠色的。 一切都很好。

Tools -> Extension and updates更新 NuGet Tools -> Extension and updates並使用命令PM> Update-Package -reinstall System.Data.SQLite.Core重新安裝 SQLite.Core 為我修復了它。

我在多項目解決方案中遇到了類似的問題。 SQLite.Interop.dll 是使用 ClickOnce 隨軟件分發的插件之一所必需的。

至於在 Visual Studio 中調試,一切正常,但部署的版本缺少包含該 DLL 的文件夾 x86/ 和 x64/。

使用 ClickOnce 部署后使其工作的解決方案是在解決方案的啟動項目(也是正在發布的項目)中創建這兩個子文件夾,將 DLL 復制到它們中並將它們設置為 Content Copy Always。

這樣 ClickOnce 發布工具會自動將這些文件和文件夾包含在清單中,並使用它們部署軟件

這里確實有很多答案,但我的答案簡單明了,沒有 GAC-playing-around

問題是,可執行文件需要正確的SQLite.Interop.dll (x86 或 x64)的副本才能訪問我們的數據庫。

大多數架構都有層,在我的情況下,數據層具有 SQLite 連接所需的 DLL。

所以我簡單地將后期構建腳本放入我的數據層解決方案中,一切正常。


TL; 博士;

  1. 在構建選項中將解決方案的所有項目設置為x86x64

  2. 使用SQLite nuget Package將以下Post-Build-Script添加到項目中:

    xcopy "$(TargetDir)x64" "$(SolutionDir)bin\\Debug\\" /y

當然,您必須更改Release Buildx86版本的腳本。


STL; DR;

將您的SQLite.Interop.dll放在*.exe文件旁邊。

舊項目文件格式

即以<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">開頭的<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

將以下內容添加到“main”/root 項目上的 csproj

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

新的 SDK 項目文件格式

即以<Project Sdk="Microsoft.NET.Sdk.*">開頭的<Project Sdk="Microsoft.NET.Sdk.*">

PrivateAssets="none"添加到依賴鏈中的每個 ProjectReference/PackageImport 直到 System.Data.Sqlite PackageImport

前任:

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

來自 NuGet 的 SQLite 多體系結構(x86、x64)版本的默認安裝表現出您描述的行為。 如果您想為 .NET 運行時選擇在您的機器上運行您的應用程序的實際架構加載正確的版本,那么您可以向 DLL 加載程序提供有關在何處找到正確庫的提示,如下所示:

在你的 Program.Main() 之前添加一個 kernel32.dll 函數調用到 SetDLLDirectory() 的聲明:

    [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode, SetLastError = true)]
    [return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string lpPathName);

然后使用您自己的方法來確定正確的子目錄以查找“SQLite.Interop.dll”的體系結構特定版本。 我使用以下代碼:

    [STAThread]
    static void Main()
    {
        int wsize = IntPtr.Size;
        string libdir = (wsize == 4)?"x86":"x64";
        string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
        SetDllDirectory(System.IO.Path.Combine(appPath, libdir));

即使是舊帖子,我也想分享我在這里找到的解決方案: http : //system.data.sqlite.org/index.html/info/54e52d4c6f

如果您不想閱讀所有問題,解決方案是將文件“msvcr100.dll”(可以在 Windows\\System32 目錄中找到)復制到與 SQLite.Interop.dll 相同的路徑中。

我建議閱讀該問題以了解原因,並將該文件包含在您的設置中,但僅在發生錯誤時才安裝它,我將其設置為可在設置選項中選擇的可選組件。

HTH, 福門茨

我不知道為什么這還沒有被包括在內,但我必須做研究並為自己找到這個,所以希望有人能找到這個答案並省去麻煩。 這是一個 WPF 應用程序。 它在我的開發箱上運行良好,但在我復制它的計算機上不起作用,並出現Unable to load DLL 'SQLite.Interop.dll'錯誤。 當我運行它時遇到與 OP 相同的錯誤時,我將其所有關聯的目錄和文件直接從我的“調試”文件夾移植到另一台計算機。 包含我的 DLL 的“bin”文件夾已被復制到“Debug\\bin”,並且當我使用此路徑復制到另一台計算機時,所有文件以及我的應用程序文件都被包含在內,因此它沒有丟失任何文件。

我在其他答案中看到的內容不適用:

  • 我沒有使用 NuGet 包或需要創建似乎是 NuGet 包創建的 x86 或 x64 文件夾。 我的 DLL(System.Data.SQLite 和 SQLite.Interop.dll,以及 System.Data.SQLite.config)位於我項目的“bin”文件夾中,並被手動復制(在解決方案資源管理器中創建“bin”文件夾) VS,將 DLL 粘貼到 Windows 資源管理器中的此文件夾中,使用添加 > 現有項目將文件放入 VS 文件夾/項目中)。 然后我在我的項目中使用該位置(“參考”>“添加參考”,並瀏覽到一個, 沖洗,重復其余部分)將它們作為參考程序集引用。 這確保我的項目確切地知道它們在哪里。
  • 我不需要在我的 app.config 中引用任何 SQLite DLL 文件,甚至不需要接觸我的 MyProject.csproj 文件。
  • 我什至不需要指定特定的處理器! 我的項目構建適用於“任何 CPU”,即使我只有混合或 64 位 DLL,並且只能在 64 位操作系統的 Windows 7+ 上運行。 (沒有 x86-only/32-bit only DLLs)
  • 當我遇到 OP 的錯誤時,我已經將它們指定為這些 DLL 的“內容”和“如果更新則復制”。

我發現的是這個,來自https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20

(11) 為什么我在嘗試運行我的應用程序時會得到一個 DllNotFoundException(對於“sqlite3.dll”或“SQLite.Interop.dll”)?

無法找到指定的動態鏈接庫 (DLL),或者由於缺少依賴項而無法加載。 確保命名的動態鏈接庫位於應用程序目錄或系統 PATH 中的目錄中,然后重試。 此外,請確保已安裝必要的 Visual C++ 運行時可再發行組件,除非您使用的是靜態鏈接到它的動態鏈接庫。

強調我在段落內的粗體部分。 目標計算機是全新的,除 .NET 4.0 外沒有加載任何程序。 一旦我安裝了 C++,它就能夠完成 SQLite 的命令。 這應該是第一個常見問題解答之一,也是先決條件的一部分,但它被埋在了#11。 我的開發計算機已經加載了它,因為它帶有 Visual Studio,這就是它在那里工作的原因。

下載:
適用於 Visual Studio 2015 的 Visual C++ 可再發行組件:
https://www.microsoft.com/en-us/download/details.aspx?id=48145

更新 3(累積更新):
https://www.microsoft.com/en-us/download/details.aspx?id=53587

正如SQLite wiki所說,您的應用程序部署必須是:

應用部署

所以你需要遵守規則。 找到與您的目標平台匹配的dll並將其放置在位置,如圖所示。 DLL 可以在 YourSolution/packages/System.Data.SQLite.Core.%version%/ 中找到。

我在應用程序部署方面遇到了問題,所以我只是將正確的 SQLite.Interop.dll 添加到我的項目中,將 x86 文件夾添加到安裝項目中的 AppplicationFolder 並添加了對 dll 的文件引用。

在調試文件夾中復制 x86 和 x64 的“SQLite.Interop.dll”文件。 這些文件應復制到調試文件夾中的“x86”和“x64”文件夾中。

我遇到過同樣的問題。 請按照以下步驟操作:

  1. 確保你已經安裝了來自NuGet SQLite Development Team System.Data.SQLite.Core包。
  2. 轉到項目解決方案並嘗試在packages文件夾中找到build文件夾
  3. 檢查您的項目框架並選擇所需的 SQLite.Interop.dll 並將其放在您的調試/發布文件夾中

參考

如果您嘗試在 64 位項目中運行 32 位 dll,您也可能會收到此錯誤。

當我在 x86 和 x64 文件夾中放置相同的文件(32 位版本的 SQLite.Interop.dll)時,我得到了這個。

如果您為SQLite下載了正確的二進制文件,則根據您的項目構建選項將SQLite.Interop.dll復制到您的ReleaseDebug文件夾中。

我已經開始使用 Costura.Fody 來打包 (.net) 程序集並嵌入和預加載本機 dll。 這也有助於以后分發,因為您可以發送一個文件。

  1. 從 Nuget 安裝 Costura Fody。

  2. 在您的 C# 項目中,創建一個名為 costrua32 的文件夾。 在那里添加要加載的 C# 的任何本機 dll。

  3. 將它們添加到此文件夾后。 單擊屬性窗口並將構建操作更改為“嵌入式資源”

  4. 最后,您需要修改名為 FodyWeavers.xml 的 XML 文件,如下所示。 這里我指定首先加載 sql dll。 (注意你刪除了 .dll)

     Weavers Costura PreloadOrder SQLite.Interop tbb_debug tbb /PreloadOrder> /Costura /Weavers

這樣做的好處是您不必編寫任何構建前或構建后事件,並且最終產品完全封裝在一個更大的文件中。

我遇到這個問題是因為我的 PC 中沒有安裝 Visual C++ 2010 可再發行組件。如果您還沒有安裝 Visual c++ 2010 可再發行組件,請下載並安裝它(檢查 x86 或 64 dll)。

我遇到了同樣的問題。 但是,最后,我可以修復它。 目前,我使用 Visual Studio 2013 社區版。 我只是使用Add->Existing Item...並瀏覽到 SQLite.Data.SQLite 文件所在的位置(我的例子是'C:\\Program Files (x86)\\System.Data.SQLite\\2013\\bin')。 請不要忘記更改您將包含到程序集文件 (*.dll; *.pdb) 的內容的類型 在該文件夾中選擇“ SQLite.Interop.dll ”。 從那時起,我可以繼續沒有任何問題。 祝大家好運。 ^_^ PS 我創建網絡表單應用程序。 我還沒有嘗試過窗體應用程序或其他應用程序。

在構建之前嘗試將平台目標設置為 x86 或 x64(而不是任何 CPU):Visual Studio 中的項目->屬性->構建->平台目標。

復制項目目錄中的 SQLite.Interop.dll。

src\
  project\
      bin\   <-- Past in bin
         x64\
           SQLite.Interop.dll <-- Copy this if 64
         x86\
           SQLite.Interop.dll <-- Copy this if 32

我為此苦苦掙扎了很長時間,偶爾,我發現測試設置不正確。 看這張圖片:測試設置

我只是取消選中測試設置,問題就消失了。 否則會出現異常。 希望這會對某人有所幫助。 不確定這是根本原因。

我的應用程序是一個 Web 應用程序 (ASP.NET MVC),我不得不更改應用程序池以在LocalSystem而不是ApplicationPoolIdentity下運行。 去做這個:

  1. 打開 IIS 管理器
  2. 找到您的站點在其下運行的應用程序池。
  3. 從操作中單擊高級設置
  4. 將身份更改為LocalSystem

我不知道為什么這可以解決問題。

還將 dll 添加到測試項目(通過 Nuget Manager)並修復它。

升級到 Visual Studio 2019 版本。 16.10 給我造成了這個問題,其中 msbuild 報告了System.Data.SQLite.Core的以下內容:

CopySQLiteInteropFiles:
Skipping target "CopySQLiteInteropFiles" because it has no outputs.

https://github.com/dotnet/msbuild/issues/6493

微軟表示該錯誤已在版本中修復。 16.10.4. 現在只需要等待 AppVeyor 更新他們的 Visual Studio 圖像(在此之前可以使用Previous Visual Studio 2019 )。

現在,AppVeyor 正在對當前和以前的 Visual Studio 2019 映像使用損壞的 dotnet-build-engine。 現在必須顯式安裝 dotnet sdk 版本。 5.0.302:

Invoke-WebRequest -Uri 'https://dot.net/v1/dotnet-install.ps1' -UseBasicParsing -OutFile "$env:temp/dotnet-install.ps1"; & $env:temp\dotnet-install.ps1 -Architecture x64 -Version 5.0.302 -InstallDir "$env:ProgramFiles\dotnet"

大會會不會有爭執? 檢查是否有另一個應用程序在 DLL 上鎖定了文件。

如果這是原因,那么使用Sysinternal 的 Process Explorer 之類的工具來發現有問題的程序應該很容易。

HTH, 粘土

我不知道這是否是一個好的答案,但我能夠通過在具有“本地系統”標識的 AppDomain 下運行我的應用程序來解決這個問題。

我正在開發一個簡單的控制台應用程序,將一些測試數據添加到 SQLite 數據庫中,但出現此錯誤。 項目的組態為“任何 CPU”。 我通過將 SQLite.Interop.dll 復制到 bin\\debug 文件夾來修復它。 更好的方法是使用@Wil 的方法,但是如何為“任何 CPU”配置指定此方法?

供查看此問題的人參考:

如果您使用nuget包,它會安裝一個構建規則,為您執行復制。 (請參閱System.Data.SQLite.Core.1.0.94.0 \\ build - 或您安裝的任何Core版本)。

nuget安裝程序會自動將規則添加到項目文件中。

但這仍然無法解決測試用例問題。 DeploymentItem( https://stackoverflow.com/a/24411049/89584 )方法似乎是唯一可行的方法。

我在一個帶有WebAPI / MVC5 Web項目和功能測試項目的解決方案中遇到了這個問題,它們都使用了相同的數據訪問(或“核心”)項目。 我和其他許多人一樣,在Visual Studio 2013中使用通過NuGet下載的副本。

我所做的是,在Visual Studio中為功能測試和Web項目添加了一個x86和x64解決方案文件夾。 然后我做了Right Click | Add Existing Item... Right Click | Add Existing Item... ,並為每個文件夾中的..\\SolutionFolder\\packages\\System.Data.SQLite.Core.1.0.94.0\\build\\net451\\[appropriate architecture]添加適當的SQLite.interop.dll庫。 然后我做了Right Click | Properties Right Click | Properties ,並將“ Copy to Output Directory設置為“ Always Copy 下次我需要運行我的功能測試時,測試成功運行。

簡而言之

為了使這個也與NCrunch一起工作,我不得不將隨NuGet包提供的Interop.dll版本添加為NCrunch配置中的附加文件

我的情況

我有一個C#解決方案,其中一個項目直接依賴於SQLite(一個幫助程序庫)和一個使用這個幫助程序庫的單元測試項目。 我已經將System.Data.SQLite.Core版本1.0.97.0安裝為NuGet包。

在我的例子中,Marin提供解決方法使其在Visual Studio和CI中工作。 然而,這仍然會在NCrunch中提供錯誤。

在NCrunch配置中,我在單元測試項目設置下的“要包括的附加文件”中添加了以下路徑:

..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\**.dll

由於這個問題的復雜性,我想在這里發布。 我的解決方案是回滾到 .Net 4.0。 我已經測試了 3 天,但無法讓 System.Data.SQLite.Core.1.0.98.0 與 .Net 4.5 或 .Net 4.5.1 一起使用。

在 3 台計算機、2 台服務器和一台開發 PC 上進行了詳盡的測試。 我一直無法找到問題的根源。 我試過編輯 .vsproj 文件。 我實際上已將 SQLite.interop.dll 添加到所有文件夾中。 我已將該包應用於所有 GAC 文件夾,並單獨刪除並重新應用。 最終被移除。

我確實有 System.Data.SQLite.Core.1.0.98.0 與 .Net 4.0 一起工作。 我打算繼續嘗試遷移,但我想我會先開始一個新項目,看看我是否可以讓它以這種方式工作。 這最初是一個 .Net 3.5 網絡應用程序,在我的旅行中,我發現大量信息仍在引用該框架。

我的情況有點特殊。 我在 docker 容器中運行一個應用程序並不斷收到以下錯誤

System.DllNotFoundException:無法加載共享庫“SQLite.Interop.dll”或其依賴項之一。 為了幫助診斷加載問題,請考慮設置 LD_DEBUG 環境變量:libSQLite.Interop.dll: cannot open shared object file: No such file or directory

所以我設置LD_DEBUG=libs來找出System.Data.SQLite.dll正在尋找哪些文件夾來查找SQLite.Interop.dll

您可以在此處找到有關設置LD_DEBUG 的信息: http : //www.bnikolic.co.uk/blog/linux-ld-debug.html

一旦我這樣做了,我意識到SQLite.Interop.dll被找到就好了。 未找到的 DLL 是libSQLite.Interop.dll 我應該閱讀整個錯誤信息。

經過數小時的谷歌搜索,我找到了有關如何從 SQLite 源代碼編譯丟失的 DLL 的指南

請注意,實際丟失的文件是libSQLite.Interop.dll.so

無論如何,當您編譯源代碼時,您會得到libSQLite.Interop.so ,您需要將其重命名為libSQLite.Interop.dll.so並將其放在它正在查找的目錄中,您可以通過設置LD_DEBUG找到該目錄。

對我來說System.Data.SQLite.dll正在查找的目錄是/usr/lib/x86_64-linux-gnu/

您確實需要通過 NuGet 安裝 System.Data.SQLite.Core。 如果您使用 InnoSetup,請確保 .iss 文件的 [Files] 部分中有以下幾行:

Source: "C:\YourProjectPath\bin\Release\x64\*"; DestDir: "{app}\x64"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\YourProjectPath\bin\Release\x86\*"; DestDir: "{app}\x86"; Flags: ignoreversion recursesubdirs createallsubdirs

將“ YourProjectPath ”更改為項目的路徑。

我自己也遇到過這個問題,但后來證明是另外一個原因:

System.DllNotFoundException was caught 
Unable to load DLL 'SQLite.Interop.dll': Access is denied. 

在這種情況下,代碼是(間接)從 IIS 托管的 Web 服務(為 x86 構建配置)調用的。 我終於將其追蹤到 IIS 中的應用程序池:最初我使用的是“ASP.NET V4.0 Integrated” (導致該錯誤),但是當我將其更改為“DefaultAppPool”時,問題就消失了。

(呸!)

所以,我的問題是 SQLite 試圖在設計時在 WPF 中加載。 由於我只關心 x86 環境,因此我將 CPU 首選項設置為該選項並將 SQLite.Interop.dll 從 Nuget 包復制到解決方案的根目錄。 重新啟動解決方案,所有問題都消失了。 因此,如果您遇到設計時問題,請將庫放入解決方案的根目錄中。

此外,我在運行時遇到了類似的問題,因此我必須將 SQLite.Interop.dll 的副本放入我的項目中,並在屬性中將其設置為復制。 提供的 x86 和 x64 文件夾似乎完全沒用。 需要進一步調查,但總的來說……在項目中手動引用 SQLite 比使用 Nuget 包更容易。

此外,官方常見問題解答指出以下內容:

(20) 當 System.Data.SQLite 項目從 Visual Studio 內部編譯和運行時,為什么我在嘗試運行或調試應用程序?

在 Visual Studio 中編譯和運行使用 System.Data.SQLite 項目(包括測試項目)的解決方案時,選擇正確的生成配置和平台非常重要。 首先,要在 Visual Studio 中調試的托管應用程序不能使用混合模式程序集(即因為它始終編譯到特定於平台的構建輸出目錄)。 這對於正確支持使用相同源項目文件為多個平台構建二進制文件是必要的。 因此,從依賴 System.Data.SQLite 程序集的 Visual Studio 內部運行托管應用程序時,應僅選擇“DebugNativeOnly”或“ReleaseNativeOnly”構建配置。 這些構建配置包含一個自定義的構建后步驟,該步驟將所需的本機程序集復制到托管輸出目錄(即,啟用就地運行托管二進制文件)。 但是,只有在所選平台與操作系統匹配時才會執行此構建后步驟(例如,“Win32”適用於 32 位 Windows,“x64”適用於 64 位 Windows)。 因此,在嘗試在解決方案中運行托管項目之前,最好根據操作系統仔細檢查所選的構建平台。

https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20

我的也不適用於單元測試,並且由於某種原因,Michael Bromley 涉及 DeploymentItem 屬性的答案不起作用。 但是,我使用測試設置讓它工作。 在 VS2013 中,向您的解決方案添加一個新項目並搜索“設置”並選擇“測試設置”模板文件。 將其命名為“SqliteUnitTests”或其他名稱並打開它。 選擇右側的“部署”,然后添加目錄/文件。 將路徑/目錄添加到您的 SQLite.Interop.dll 文件。 對我來說,我添加了兩條路徑,分別用於 Project\\bin\\Debug\\x64 和 Console\\bin\\Debug\\x86。 您可能還想添加 Sqlite 文件,具體取決於您希望單元測試/解決方案如何訪問該文件。

擴展對我有用的 Kugel 答案(VS2015 Enterprise)利用 dll 中的 SQLite,在構建和測試后,可以從主項目中刪除 Nuget 包:

1.安裝Nuget包到主項目。

Install-Package System.Data.SQLite

2.構建應用程序並測試您的 Sqlite 連接是否正常工作:

select * from sqlite_master

3.從主構建中卸載 Nuget 包。

UnInstall-Package System.Data.SQLite

4.手動刪除SQLite和EntityFramework的dll引用:

System.Data.SQLite
System.Data.SQLite.EF6
System.Data.SQLite.Linq
  1. 從主項目的“packages.config”xml 文件中刪除 Xml 引用。

這對我有用並保持我的項目干凈。

在 SQLLite Core 的Nuget 包中有一個文件System.Data.SQLite.Core.targets 只需將其包含在使用此庫的所有項目和使用您的庫的所有庫中。

在您的 .csproj 或 .vbproj 文件中添加: 每次您在 bin 中編譯時都會添加 x86 和 x64 目錄以及 SQLite.Interop.dll 文件。

剛剛為我工作:在包管理器控制台上Install-Package System.Data.SQLite.Core

這對我有用。

  1. 打開 Visual Studio,通過 NUGET 包管理器搜索並安裝 SQLite.Core。
  2. 轉到 VS 中的解決方案資源管理器,右鍵單擊您的項目名稱-->添加-->新文件夾
  3. 將文件夾命名為 x64
  4. 重復該過程並添加文件夾並將其命名為 x86
  5. 右鍵單擊 x64 文件夾-->ADD-->EXISTING ITEM 然后瀏覽到 DEBUG 文件夾。 您將找到 x64 文件夾。 打開它並選擇“SQLite.Interop.dll”文件,然后點擊“確定”。
  6. 對 x86 文件夾重復步驟 5。
  7. 右鍵單擊您剛剛添加的 DLL 並選擇屬性。 在選項復制到輸出目錄中,選擇始終復制。
  8. 對 x64 和 x86 文件夾中的兩個 DLL 重復步驟 7。

下次構建項目並將其帶到另一台計算機時,它應該可以正常工作。

我在這里嘗試了幾乎所有的解決方案,但沒有任何運氣。 最后通過將與我選擇的平台對應的 SQLite.Interop.dll 的副本直接放在我的安裝項目的根目錄下來解決它。

我不知道為什么它有效,但確實有效。

超過 30 個答案,但我以不同的方式解決了它。

我有 2 個獨立的項目。 一個 Windows 服務和一個 Windows 窗體應用程序。 App 引用了 WS 項目,並且都引用了 SQLite Core nuget 包。

構建 WS 項目時,x64 和 x32 文件夾都在那里。 但是在構建應用程序時,文件夾不顯示。

檢查這里的答案,我無法讓它們工作。 但我發現以下代碼片段存在於 WS 項目中,而在 App 項目中卻沒有。 我添加了它,文件夾現在正確顯示。

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

我發現當我允許 Nuget 將 SQLite 更新到 1.0.115.5 時,我的項目不再需要“SQLite.Interop.dll”。

我想出了一個解決方案。

就我而言,我使用的是 Microsoft Visual Studio Installer Project。 安裝項目看不到主要輸出中的 x64 和 x86 文件夾和內容。

解決方案:

  1. 將 x64 和 x86 文件夾添加到安裝程序中的應用程序文件夾。
  2. 添加兩個文件夾的內容。

這將允許安裝程序復制 SQLite 工作所需的 DLL 文件。

我希望你一切都好。

一種對我有用的解決方案是從 nuget 包中安裝 System.Data.SQLite。

導入你要導入的項目的.dll,安裝System.Data.SQLite。

這將安裝與您的解決方案/項目兼容和更新的 ddl。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM