Không thể tải DLL 'SQLite.Interop.dll'


205

Định kỳ tôi nhận được ngoại lệ sau:

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

Tôi đang sử dụng 1.0.82.0. phiên bản, cài đặt nó với nuget trong VS2010, OS Win7 64.

Khi ngoại lệ bắt đầu xuất hiện, nó xuất hiện liên tục - trong gỡ lỗi và phát hành và chạy ứng dụng trong hoặc ngoài VS.

Cách duy nhất để ngăn chặn nó là đăng xuất và đăng nhập. Ngoại lệ không được ném và dll được tải. Nó có thể làm việc trong nhiều ngày, nhưng sau đó nó có thể phá vỡ một lần nữa.

Có ai nhìn thấy một cái gì đó như thế này và có một giải pháp cho nó?


2
Có, nó được thiết lập để sao chép luôn. Tôi có các thư mục x64 và x86 trong bin / debug. Và nó hoạt động chủ yếu, nhưng đôi khi chỉ dừng lại để làm việc. Có lẽ một cái gì đó đang chặn truy cập vào dll, tôi sẽ cố gắng tìm ra nó vào lần tới khi nó dừng hoạt động. Như tôi đã nói nó có thể làm việc nhiều ngày mà không có vấn đề gì.
xll

13
Tôi đã nhận được lỗi này ngay lập tức sau khi thêm gói nuget SQLite vào một dự án giao diện điều khiển mới. Sao chép thủ công SQLite.Interop.dll từ thư mục x86 lên một cấp cho phép ứng dụng chạy. Có vẻ lạ đối với tôi rằng điều này sẽ rất tan vỡ.
lesscode

@Wayne Vâng, điều này chắc chắn sẽ giúp. Nhưng trong trường hợp của tôi, chúng tôi đang làm việc cùng nhau trong dự án và bạn tôi đang sử dụng x86, trong khi tôi x64 OS. Và như tôi nhận thấy, đôi khi nó chỉ dừng lại để làm việc. Mặc dù nó đã không xảy ra với tôi vào tháng trước.
xll

1
Nếu bạn tải xuống nhị phân chính xác cho SQLite thì sao chép SQLite.Interop.dll vào thư mục Phát hành hoặc Gỡ lỗi theo tùy chọn xây dựng dự án của bạn.
El Sơn

Đây là một lỗi ngẫu nhiên ... đôi khi nó xảy ra và đôi khi nó không dành cho dự án của tôi. Đã thử tất cả mọi thứ.
BK

Câu trả lời:


140

Tôi biết tôi đến bữa tiệc muộn nhưng tôi đã gặp vấn đề này ngay sau khi tôi rút xuống x86 / x64 mới nhất hôm nay (phiên bản 1.0.88.0). IIS cục bộ của tôi trong VS2012 theo mặc định chạy 32 bit và không có cách nào dễ dàng để chuyển sang x64. Máy chủ sản xuất của tôi chạy 64 bit.

Dù sao tôi đã cài đặt gói NuGet cho một dự án DLL và tôi đã gặp lỗi này. Những gì tôi phải làm để làm cho nó hoạt động tôi cũng phải cài đặt nó vào dự án trang web chính . Ngay cả khi nó không chạm vào các lớp SQLite.

Tôi đoán là SQLite sử dụng cụm mục nhập để phát hiện phiên bản Interop nào sẽ tải.


11
Nó hoạt động với tôi sau khi tôi thêm tham chiếu đến SQLite Core với NuGet vào dự án chính.
Luca Cremonesi

Thêm sqllite.core vào dự án chính đã giúp tôi giải pháp WPF của mình
Dipu Raj

Tôi đã phải thực hiện cả Sqlite gói cài đặt cũng như System-Gói System.Data.SQLite. Vào trang web của tôi ngay cả khi các cuộc gọi db nằm trong thư viện ...

Đây nên là câu trả lời.
Bobby Turkalino

4
Bạn có ý nghĩa gì với dự án "trang web chính"? Trong trường hợp của tôi, tôi đang làm công việc máy tính để bàn. Ý bạn là dự án "khởi nghiệp"?
UuDdLrLrSs

60

Tôi gặp vấn đề này bởi vì một dll tôi đang sử dụng có Sqlite làm phụ thuộc (được định cấu hình trong NuGet chỉ với gói lõi Sqlite.). Dự án biên dịch và sao chép tất cả các dll-s Siteite ngoại trừ 'SQLite.Interop.dll' (cả thư mục x86 và x64).

Giải pháp rất đơn giản: chỉ cần thêm gói Sqlite.Core làm phụ thuộc (với NuGet) vào dự án bạn đang xây dựng / đang chạy và dll-s sẽ được sao chép.


Đã làm cho tôi ! Cảm ơn
Tristan Djahel 30/03/2015

Đã đồng ý. Tôi đang sử dụng gói 'Sqlite.Net PCL' nhưng thấy tôi cũng cần 'System.Data.SQLite Core (x86 / x64)'. Tôi cũng đã phải thay đổi (các) dự án tham chiếu dự án để sử dụng mục tiêu Nền tảng là 'x86' hoặc 'x64', thay vì 'Bất kỳ CPU nào'.
Andrew Stephens

2
Đã thử khá nhiều giải pháp được đăng ở đây, giải pháp này thực sự hiệu quả nhất.
dơi

2
Làm thế nào bạn có thể thêm một phụ thuộc như vậy? không bao giờ làm điều đó (VS2013)
jpgrassi

3
Chuyển đến Công cụ -> Trình quản lý gói NuGet -> Quản lý các gói NuGet cho Giải pháp ... -> Trực tuyến -> Tất cả. Sau đó Tìm kiếm sqlite và thêm System.Data.SQLite Core (x86 / x64).
Marin

44

Tôi gặp vấn đề tương tự khi sử dụng SQLite trong dự án WPF có mục tiêu nền tảng là Any CPU. Tôi đã sửa nó bằng cách làm theo các bước sau:

  1. Mở trình thiết kế dự án trong Visual Studio. Chi tiết về cách làm có thể được tìm thấy ở đây .
  2. Nhấp vào tab Build.
  3. Vô hiệu hóa prefer 32-bittùy chọn.

Ngoài ra, bạn chỉ có thể đặt mục tiêu nền tảng thành x86hoặc x64. Tôi nghĩ vấn đề này là do System.Data.SQLitethư viện sử dụng mục tiêu nền tảng để lấy vị trí của tệp 'SQLite.Interop.dll'.

CẬP NHẬT:

Trong trường hợp không thể đạt được trình thiết kế dự án, chỉ cần mở tệp dự án ( *.csproj) từ trình soạn thảo văn bản và thêm giá trị <Prefer32Bit>false</Prefer32Bit>vào <PropertyGroup>...</PropertyGroup>thẻ.

Mã ví dụ

<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>

Tôi đang sử dụng VS 2010, không có tùy chọn như vậy.
xll

@xll, tôi chỉnh sửa câu trả lời để làm rõ. Kiểm tra nếu chỉnh sửa xóa mọi thứ lên.
Caleb Kiage

10
Trong VS2012, tùy chọn này có màu xám đối với tôi.
Kugel

6
Tùy chọn chỉ được kích hoạt trên các dự án EXE, nhưng tôi nghĩ rằng hầu hết chúng ta đều gặp phải vấn đề này với các dự án thử nghiệm đơn vị.
Brannon

1
Đã bị mờ mắt đối với tôi trong một dự án WPF trong VS Pro 2015. .csprojtệp đã được đặt thành false, nhưng vẫn có lỗi.
vapcguy

32

Đây là cách tôi sửa nó trong dự án của tôi.

Nó đang hoạt động và khi một đồng nghiệp gửi các thay đổi của anh ấy, tôi đã nhận được ngoại lệ "Không thể tải DLL 'SQLite.Interop.dll'".

Khác với tệp .csproj của dự án, đây là phiên bản KHÔNG LÀM VIỆC:

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

Và đây là những gì phiên bản LÀM VIỆC đã có:

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

Sau khi trở lại, tôi đã không nhận được ngoại lệ. Các tệp DLL đã được kết xuất trong các thư mục Debug \ x64 (vv) thích hợp.


<itemgroup> cho "SQLite.Interop.dll" không có trong tệp .csproj của dự án. tôi vẫn cố thêm giải pháp của bạn nhưng không hiệu quả :(
ayc 28/03/2015

Điều này sẽ không hoạt động trong VS2012, các yếu tố không tồn tại.
htm11h

Cảm ơn rât nhiều. Hoạt động trong năm 2015 so với
Jevgenij Kononov

29

Vì vậy, sau khi thêm NuGet, việc triển khai không sao chép các Interops. Bạn có thể thêm nó vào tệp csproj của bạn và nó sẽ khắc phục hành vi đó:

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

Nếu bạn tìm trong nguồn cho NuGet cho SQLite, bạn có thể thấy những gì chúng đang làm cụ thể. Điều này cho phép tôi có được một triển khai làm việc với ASP.Net Core.


10
ContentQueryiteInteropFiles là câu trả lời. Hầu hết các câu trả lời hàng đầu là phỏng đoán.
Corey Alix

6
Có, ContentQueryiteInteropFiles là câu trả lời. 1. Đây phải là câu trả lời được chấp nhận 2. Mặt khác, cần phải điều tra, rằng là một gói nuget làm thế nào để làm cho công việc này tự động, hoặc ít nhất là tài liệu cần thiết cho cấu hình này.
gerleim

Nên là câu trả lời được chấp nhận. Siêu đơn giản. 1. dỡ dự án 2. thêm phần trên vào csproj 3. tải lại dự án. thật dễ dàng ...
BillRuhl

24

Khi bạn ở trạng thái này, hãy thử thực hiện Rebuild-All. Nếu điều này khắc phục vấn đề, bạn có thể có cùng một vấn đề tôi đã có.

Một số nền tảng (sự hiểu biết của tôi) :

  • SQLite có 1 hội đồng được quản lý (System.Data.SQLite.dll) và một số hội đồng cụ thể nền tảng (SQLite.Interop.dll). Khi cài đặt SQLite với Nuget, Nuget sẽ thêm các cụm cụ thể nền tảng vào dự án của bạn (trong một số thư mục: \ x86, \ x64) và định cấu hình các dll này thành "Sao chép luôn".

  • Khi tải, hội đồng được quản lý sẽ tìm kiếm các hội đồng cụ thể nền tảng bên trong các thư mục \ x86 và \ x64. Bạn có thể xem thêm về điều đó ở đây . Ngoại lệ là hội đồng được quản lý này đang cố gắng tìm kiếm có liên quan (SQLite.Interop.dll) trong các thư mục này (và không thành công).

Kịch bản của tôi :

Tôi có 2 dự án trong giải pháp của mình; một ứng dụng WPF và một thư viện lớp. Ứng dụng WPF tham chiếu thư viện lớp và thư viện lớp tham chiếu SQLite (được cài đặt qua Nuget).

Vấn đề đối với tôi là khi tôi chỉ sửa đổi ứng dụng WPF, VS cố gắng xây dựng lại một phần (nhận ra rằng dll phụ thuộc đã không thay đổi). Ở đâu đó trong quy trình này, VS xóa nội dung của các thư mục \ x86 và \ x64 (thổi bay SQLite.Interop.dll). Khi tôi thực hiện Rebuild-All đầy đủ, VS sao chép chính xác các thư mục và nội dung của chúng.

Giải pháp của tôi :

Để khắc phục điều này, tôi đã kết thúc việc thêm quy trình Post-Build bằng xcopy để buộc sao chép các thư mục \ x86 và \ x64 từ thư viện lớp vào thư mục WPF project \ bin của tôi.

Ngoài ra, bạn có thể thực hiện những điều lạ hơn với các thư mục cấu hình / đầu ra xây dựng.


1
Tin nhắn tôi nhận được nói với tôi rằng những tập tin đó bị thiếu nhưng tôi nghĩ đó là vấn đề cho phép. Khi tôi thấy tin nhắn của bạn, tôi nhận ra rằng họ chưa bao giờ thực sự gửi nó đến máy chủ khi tôi triển khai.
Stradas

1
Giải pháp gần giống hệt của tôi là thêm các thư mục x86 và x64 vào dự án khởi động của tôi, sau đó thêm các tệp interop x86 và x64 trong các thư mục tương ứng của chúng. Tôi đặt tùy chọn của tệp thành "nội dung" và "luôn luôn xây dựng." Đây là cách duy nhất tôi có thể khiến ứng dụng Windows Forms của mình kết nối với tệp cơ sở dữ liệu s3db được nhúng khi tôi triển khai ứng dụng với ClickOnce cho các PC khác. Thật khó chịu, tôi đã không gặp lỗi SQLite khi tôi phát triển và thử nghiệm ứng dụng trên PC.
David Alan Condit

Vẫn xảy ra với VS 2017: '(
wmebane

1
Đây là câu trả lời giúp tôi hiểu vấn đề của mình, mặc dù cách khắc phục của tôi hơi khác một chút. Vấn đề của tôi là tôi đã thêm system.data.Sqlite.dll theo cách thủ công. Theo cách này, Sqlite.Interop.dll không được sao chép tự động sang \ x86 và x64. Cách khắc phục là xóa tham chiếu và thêm nó bằng Nuget.
Susan Wang

19

Tôi gặp vấn đề tương tự khi chạy Visual Studio Express 2013. Tôi đã thử một số giải pháp được đề cập ở đây và các nơi khác nhưng không có kết quả. Tôi hy vọng sửa chữa này giúp những người khác.

Tôi đã sửa nó bằng cách sử dụng DeploymentItemthuộc tính trên lớp thử nghiệm của mình để kiểm tra dịch vụ dựa trên SQLite.

Thí dụ:

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

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

Điều này gây ra sự cần thiết SQLite.Interop.dllđể được sao chép vàox86 thư mục trong thư mục "TestResults" thích hợp.

Tất cả là màu xanh lá cây. Mọi thứ đều tốt.


1
Giải pháp này chỉ hoạt động nếu bạn đang sử dụng không gian tên Microsoft.VisualStudio.TestTools.UnitTesting
sapbucket

4
Đây là một giải pháp chính xác nếu bạn đang sử dụng MSTest. SQLite hoạt động tốt, tìm kiếm SQLite.Interop.dll không có vấn đề gì, cho đến khi tôi sử dụng DeploymentItem ("some.csv") để thử nghiệm. Việc bao gồm tệp .csv theo cách đó đã kích hoạt MSTest để sao chép tất cả các dll được tham chiếu qua thư mục TestResults. Vì SQLite.Interop.dll không được tham chiếu trong dự án (và không thể vì nó không được quản lý mã), nên nó không bao giờ được sao chép.
Johann

Đặt cược tốt nhất của bạn là thêm hai dòng, một dòng cho mỗi kiến ​​trúc. Điều đó bảo vệ bạn trong trường hợp người chạy thử nghiệm chạy 64-bit.
Kirk Woll

13

Cập nhật NuGet từ Tools -> Extension and updatesvà cài đặt lại SQLite. Thêm lệnh đã PM> Update-Package -reinstall System.Data.SQLite.Coresửa nó cho tôi.


Nếu bạn gặp lỗi khi thực hiện việc này, việc xóa các tệp SQL / tham chiếu SQLite của tôi và cài đặt lại hoàn toàn chúng khỏi nuget đã thực hiện thủ thuật cho tôi
kayinKoder

cài đặt lại lõi sqllite giúp tôi quá. Xảy ra tại VS2012. VS không bao gồm phiên bản x62 cho gói triển khai web
Andrey R

Đã sửa lỗi cho tôi trong VS2015 Professional.
Rahul Kishore

9

Tôi đã có một vấn đề tương tự trong một giải pháp nhiều dự án. SQLite.Interop.dll là cần thiết cho một trong những plugin được phân phối cùng với phần mềm bằng ClickOnce.

Theo như gỡ lỗi trong visual studio mọi thứ đều hoạt động tốt, nhưng phiên bản được triển khai đã thiếu các thư mục x86 / và x64 / chứa DLL đó.

Giải pháp để nó hoạt động sau khi triển khai bằng ClickOnce là tạo trong dự án khởi động của giải pháp (cũng là giải pháp được xuất bản) hai thư mục con này, sao chép vào chúng các DLL và đặt chúng thành Luôn sao chép nội dung.

Bằng cách này, công cụ xuất bản ClickOnce sẽ tự động bao gồm các tệp và thư mục này trong tệp kê khai và triển khai phần mềm với chúng


1
đây là giải pháp duy nhất hiệu quả với tôi ... và chàng trai .. có phải là một nỗi đau khi gỡ lỗi khi ứng dụng của bạn chỉ đóng trên máy tính của người dùng.
stoic

8

Thực sự có rất nhiều câu trả lời ở đây, nhưng của tôi thì đơn giản và rõ ràng với việc không chơi GAC .

Vấn đề là, Tệp thực thi cần một bản sao của quyền SQLite.Interop.dll(x86 hoặc x64) để truy cập Cơ sở dữ liệu của chúng tôi.

Hầu hết các kiến ​​trúc đều có các lớp và trong trường hợp của tôi, Lớp dữ liệu có DLL cần thiết cho kết nối SQLite.

Vì vậy, tôi đơn giản đặt một tập lệnh xây dựng bài vào Giải pháp lớp dữ liệu của mình và mọi thứ đều hoạt động tốt.


TL; DR;

  1. Đặt tất cả các Dự án của giải pháp của bạn thành x86hoặc x64trong các tùy chọn xây dựng.

  2. Thêm sau Post-Build-Scriptvào Dự án với SQLite nuget Package:

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

Tất nhiên bạn phải thay đổi kịch bản cho Release Buildx86xây dựng.


STL; DR;

Đặt SQLite.Interop.dllbên cạnh *.exeTệp.


6

Cài đặt mặc định của phiên bản đa kiến ​​trúc (x86, x64) của SQLG từ NuGet thể hiện hành vi mà bạn đã mô tả. Nếu bạn muốn tải phiên bản chính xác cho kiến ​​trúc thực tế mà thời gian chạy .NET đã chọn để chạy ứng dụng của bạn trên máy của bạn, thì bạn có thể cung cấp cho trình tải DLL một gợi ý về vị trí đặt thư viện chính xác như sau:

Thêm một khai báo cho hàm gọi kernel32.dll vào SetDLLDirectory () trước Chương trình của bạn.Main ():

    [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);

Sau đó, sử dụng phương pháp của riêng bạn để xác định thư mục con chính xác để tìm phiên bản cụ thể về kiến ​​trúc của 'SQLite.Interop.dll'. Tôi sử dụng mã sau đây:

    [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));

4

ngay cả khi đó là một bài viết cũ, tôi muốn chia sẻ giải pháp mà tôi tìm thấy ở đây: http://system.data.sqlite.org/index.html/info/54e52d4c6f

Nếu bạn không muốn đọc tất cả vấn đề, giải pháp là sao chép tệp "msvcr100.dll" (có thể tìm thấy trong thư mục Windows \ System32) trong cùng đường dẫn với SQLite.Interop.dll.

Tôi khuyên bạn nên đọc vấn đề để hiểu lý do và để bao gồm tệp trong thiết lập của bạn nhưng chỉ cài đặt nó nếu xảy ra lỗi, tôi đã biến nó thành một thành phần tùy chọn có thể lựa chọn trong các tùy chọn thiết lập.

HTH, Formentz


Cảm ơn rất nhiều vì điều này, tôi đã thử mọi thứ khác và đây là giải pháp
David Benko

4

Như wiki SQLite nói, việc triển khai ứng dụng của bạn phải là:

Ứng dụng triển khai

Vì vậy, bạn cần phải tuân theo các quy tắc. Tìm dll phù hợp với nền tảng mục tiêu của bạn và đặt nó vào vị trí, mô tả trong hình. DLL có thể được tìm thấy trong YourSolution / gói / System.Data.SQLite.Core.% Phiên bản% /.

Tôi gặp vấn đề với việc triển khai ứng dụng, vì vậy tôi chỉ cần thêm SQLite.Interop.dll đúng vào dự án của mình, thư mục x86 được thêm vào AppplicationFolder trong dự án thiết lập và thêm tham chiếu tệp vào dll.


3

Bạn cũng có thể gặp lỗi này nếu bạn đang cố chạy dll 32 bit, trong dự án 64 bit.

Tôi đã nhận được điều này khi tôi đã đặt cùng một tệp (SQLite.Interop.dll trong phiên bản 32 bit) trong cả thư mục x86 và x64.



3

Tôi không biết tại sao điều này chưa được đưa vào, nhưng tôi phải tự mình nghiên cứu và tìm ra điều này, vì vậy hy vọng ai đó sẽ tìm thấy câu trả lời này và được cứu rắc rối. Đây là một ứng dụng WPF. Nó hoạt động tốt trên hộp Dev của tôi, nhưng không hoạt động trên máy tính nơi tôi đang sao chép nó và gặp Unable to load DLL 'SQLite.Interop.dll'lỗi. Tôi đã chuyển qua tất cả các thư mục và tệp được liên kết của nó, trực tiếp từ thư mục "Gỡ lỗi" của tôi sang máy tính khác này khi tôi gặp lỗi tương tự như OP khi tôi chạy nó. Thư mục "bin" chứa DLL của tôi đã được sao chép vào "Debug \ bin" và tất cả đều được bao gồm, cùng với các tệp ứng dụng của tôi khi tôi sao chép sang máy tính khác bằng đường dẫn này, vì vậy nó không thiếu bất kỳ tệp nào.

Những điều tôi thấy đã nói trong các câu trả lời khác không áp dụng:

  • Tôi không sử dụng gói NuGet hoặc cần tạo các thư mục x86 hoặc x64 mà dường như gói NuGet tạo ra. DLL của tôi (System.Data.SQLite và SQLite.Interop.dll, cùng với System.Data.SQLite.config) nằm trong thư mục "bin" trong dự án của tôi và được sao chép trong thư mục thủ công (tạo "bin" trong Solution Explorer trong VS, dán DLL vào thư mục này trong Windows Explorer, sử dụng Thêm> Mục hiện có để đưa tệp vào thư mục / dự án VS). Sau đó, tôi tham chiếu chúng dưới dạng Tập hợp được tham chiếu trong dự án của mình bằng cách sử dụng vị trí đó ("Tài liệu tham khảo"> "Thêm tài liệu tham khảo" và duyệt đến một, rửa sạch, lặp lại cho phần còn lại). Điều này đảm bảo dự án của tôi biết chính xác vị trí của chúng.
  • Tôi không cần tham chiếu bất kỳ tệp SQLite DLL nào trong app.config hoặc thậm chí chạm vào tệp MyProject.csproj của mình.
  • Tôi thậm chí không cần chỉ định một bộ xử lý cụ thể! Bản dựng dự án của tôi là dành cho "Bất kỳ CPU" nào, mặc dù tôi chỉ có các tệp DLL hỗn hợp hoặc 64 bit và sẽ chỉ chạy trên Windows 7+, là các hệ điều hành 64 bit. (không có DLL chỉ x86 / 32 bit)
  • Tôi đã chỉ định chúng là "Nội dung" và "sao chép nếu mới hơn" cho các DLL này khi tôi gặp phải lỗi của OP.

Những gì tôi tìm thấy là cái này, từ https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :

(11) Tại sao tôi nhận được một DLLNotFoundException (cho "sqlite3.dll" hoặc "SQLite.Interop.dll") khi thử chạy ứng dụng của tôi?

Thư viện liên kết động được đặt tên (DLL) không thể được định vị hoặc không thể tải được do thiếu phụ thuộc. Đảm bảo thư viện liên kết động được đặt tên nằm trong thư mục ứng dụng hoặc thư mục dọc theo hệ thống PATH và thử lại. Ngoài ra, hãy chắc chắn rằng bộ phân phối thời gian chạy Visual C ++ cần thiết đã được cài đặt trừ khi bạn đang sử dụng thư viện liên kết động được xây dựng liên kết tĩnh với nó.

Nhấn mạnh vào phần in đậm bên trong đoạn văn. Máy tính mục tiêu mới và không có chương trình nào được tải ngoại trừ .NET 4.0. Khi tôi cài đặt C ++, nó có thể hoàn thành các lệnh thành SQLite. Đây phải là một trong những Câu hỏi thường gặp đầu tiên và là một phần của các điều kiện tiên quyết, nhưng nó đã bị chôn vùi ở # 11. Máy tính phát triển của tôi đã tải nó vì nó đi kèm với Visual Studio, vì vậy đó là lý do tại sao nó hoạt động ở đó.

Tải xuống:
Visual C ++ Redistributable cho Visual Studio 2015:
https://www.microsoft.com/en-us/doad/details.aspx?id=48145

Cập nhật 3 (cập nhật tích lũy):
https://www.microsoft.com/en-us/doad/details.aspx?id=53587


3

Tôi đã bắt đầu sử dụng các cụm lắp ráp Costura.Fody để đóng gói (.net) và nhúng và tải trước các dll gốc. Điều này cũng giúp sau này, với phân phối như bạn có thể gửi một tệp.

  1. Cài đặt Costura Fody từ Nuget.

  2. Trong dự án C # của bạn tạo một thư mục có tên costrua32. Trong đó thêm bất kỳ dlls gốc nào mà bạn tải C #.

  3. Một khi bạn đã thêm chúng vào thư mục này. Nhấp vào cửa sổ thuộc tính và thay đổi hành động xây dựng thành "Tài nguyên nhúng"

  4. Cuối cùng, bạn cần sửa đổi tệp XML có tên FodyWeavers.xml như sau. Ở đây tôi chỉ định tải dll sql đầu tiên. (lưu ý bạn thả dll)

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

Ưu điểm của việc này là bạn không phải viết bất kỳ sự kiện xây dựng trước hoặc sau nào, và sản phẩm cuối cùng được gói gọn trong một tệp lớn hơn.


Tên thư mục phải là costura32, tài liệu github.com/Fody/Costura#native-lologists-and-preloadorder
Elton Saunders

3

Cũng đã thêm dll vào dự án thử nghiệm (thông qua Nuget Manager) và nó đã sửa nó.


2

Tôi gặp vấn đề này vì Visual C ++ 2010 có thể phân phối lại không được cài đặt trong PC của tôi. Nếu bạn chưa cài đặt Visual c ++ 2010 có thể phân phối lại Tải xuống và cài đặt cái này (kiểm tra x86 hoặc 64 dll).


Đúng. Đây cũng là trường hợp của tôi ... chỉ có tôi là yêu cầu phân phối lại Visual C ++ 2010. Tâm hồn tốt nhất là đọc kỹ thời gian chạy cần thiết cho phiên bản của bạn. Ví dụ ở đây: system.data.sqlite.org/index.html/doc/trunk/www/doads.wiki
Velja Radenkovic


2

Tôi đã có cùng một vấn đề. Tuy nhiên, cuối cùng, tôi có thể sửa nó. Hiện tại, tôi sử dụng Visual Studio 2013 Community Edition. Tôi chỉ sử dụng Thêm-> Mục hiện có ... và duyệt đến nơi chứa các tệp SQLite.Data.SQLite (trường hợp của tôi là 'C: \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin'). Xin đừng quên thay đổi loại nội dung bạn sẽ đưa vào Tập tin lắp ráp (* đậm; * .pdb) . Chọn ' SQLite.Interop.dll ' trong thư mục đó. Từ đó và sau đó, tôi có thể tiếp tục mà không có bất kỳ vấn đề nào cả. Chuc tât cả may măn. ^ _ ^ PS Tôi tạo ứng dụng mẫu web. Tôi chưa thử trong ứng dụng mẫu cửa sổ hoặc những người khác.


2

Cố gắng đặt mục tiêu nền tảng thành x86 hoặc x64 (chứ không phải bất kỳ CPU nào) trước khi bạn xây dựng: Project-> Properties-> Build-> Target target trong Visual Studio.


2

Sao chép SQLite.Interop.dll trong thư mục dự án.

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

Tôi đã phải cấp quyền IIS_APPPOOL Chỉnh sửa cho tệp Bin để giải quyết vấn đề. Chỉ cần sao chép ddl đã khiến Quyền truy cập bị từ chối vào dll
AlexanderD

Thêm các tệp này đã giải quyết các vấn đề, nhưng đây là một giải pháp tạm thời.
Kartik G lòng

2

Tôi đã vật lộn với điều này trong một thời gian dài và đôi khi, tôi thấy rằng cài đặt thử nghiệm không chính xác. Xem hình ảnh này: Cài đặt thử nghiệm

Tôi chỉ bỏ chọn cài đặt thử nghiệm và vấn đề biến mất. Nếu không, ngoại lệ sẽ xảy ra. Hy vọng, điều này sẽ giúp được ai đó. Không chắc chắn đó là nguyên nhân gốc rễ.


1
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ đánh giá
Robert Columbia

Trong trường hợp của tôi, tệp testsinstall bị sai: <TestSinstall ... <Deployment> <DeploymentItem filename = "bin \ Relase \ a.test.dll". vị trí tập tin bị cấu hình sai.
Tony Sun

2

Sao chép các tệp "SQLite.Interop.dll" cho cả x86 và x64 trong thư mục gỡ lỗi. các tệp này sẽ sao chép vào các thư mục "x86" và "x64 trong thư mục gỡ lỗi.


2

Ứng dụng của tôi là một ứng dụng web (ASP.NET MVC) và tôi đã phải thay đổi nhóm ứng dụng để chạy LocalSystemthay vì ApplicationPoolIdentity. Để làm điều này:

  1. Mở trình quản lý IIS
  2. Tìm nhóm ứng dụng mà trang web của bạn đang chạy.
  3. Nhấp vào Cài đặt nâng cao từ các hành động
  4. Thay đổi danh tính thành LocalSystem

Tôi không biết tại sao điều này khắc phục vấn đề.


1

Tôi không biết liệu đó có phải là một câu trả lời hay không, nhưng tôi đã có thể giải quyết vấn đề này bằng cách chạy ứng dụng của mình dưới AppDomain với danh tính "Hệ thống cục bộ".


1

Tôi đang làm việc trên một ứng dụng bảng điều khiển đơn giản để thêm một số dữ liệu thử nghiệm vào cơ sở dữ liệu SQLite và đã gặp lỗi này. Cấu hình cho dự án là "Bất kỳ CPU". Tôi đã sửa nó bằng cách sao chép SQLite.Interop.dll vào thư mục bin \ debug. Cách tốt hơn là sử dụng phương thức của @Wil, nhưng làm thế nào để bạn chỉ định điều này cho cấu hình "Bất kỳ CPU"?


1

Có thể có sự tranh chấp cho hội đồng? Kiểm tra xem liệu có ứng dụng khác có khóa tệp trên DLL không.

Nếu đây là lý do, thật dễ dàng để sử dụng một công cụ như Process Explorer của Sysiternal để khám phá chương trình vi phạm.

HTH, đất sét


1

Để tham khảo cho bất cứ ai nhìn vào câu hỏi này:

Nếu bạn sử dụng gói nuget, nó sẽ cài đặt quy tắc xây dựng để sao chép cho bạn. (xem trong System.Data.SQLite.Core.1.0.94.0 \ build - hoặc bất kỳ phiên bản Core nào bạn cài đặt).

Trình cài đặt nuget tự động thêm quy tắc vào tệp dự án của bạn.

Điều này vẫn không khắc phục vấn đề trường hợp thử nghiệm mặc dù. Cách tiếp cận DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) là điều duy nhất dường như hoạt động ở đó.


1

Tôi đã giải quyết vấn đề này, trong một giải pháp với dự án web WebAPI / MVC5 và dự án Kiểm tra tính năng, cả hai đều rút ra cùng một dự án truy cập dữ liệu (hoặc 'Core'). Tôi, giống như nhiều người khác ở đây, đang sử dụng một bản sao được tải xuống qua NuGet trong Visual Studio 2013.

Những gì tôi đã làm, là trong Visual Studio đã thêm một thư mục giải pháp x86 và x64 vào Kiểm tra tính năng và các dự án web. Sau đó tôi đã làm một Right Click | Add Existing Item...và thêm thư viện SQLite.interop.dll thích hợp từ ..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]mỗi thư mục đó. Sau đó tôi đã làm một Right Click | Properties, và thiết lập Copy to Output Directoryđể Always Copy. Lần tiếp theo tôi cần chạy thử nghiệm tính năng của mình, các thử nghiệm đã chạy thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.