Không thể tải tệp hoặc lắp ráp 'System.Data.SQLite'


126

Tôi đã cài đặt ELMAH 1.1 .Net 3.5 x64 trong dự án ASP.NET của tôi và bây giờ tôi gặp lỗi này (bất cứ khi nào tôi cố gắng xem bất kỳ trang nào):

Không thể tải tệp hoặc tập hợp 'System.Data.SQLite, Version = 1.0.61.0, Culture = trung tính, PublicKeyToken = db937bc2d44ff139' hoặc một trong các phụ thuộc của nó. Một nỗ lực đã được thực hiện để tải một chương trình với định dạng không chính xác.

Mô tả: Một ngoại lệ chưa được xử lý đã xảy ra trong quá trình thực hiện yêu cầu web hiện tại. Vui lòng xem lại dấu vết ngăn xếp để biết thêm thông tin về lỗi và nơi xuất phát trong mã.

Chi tiết ngoại lệ: System.BadImageFormatException: Không thể tải tệp hoặc lắp ráp 'System.Data.SQLite, Version = 1.0.61.0, Culture = trung tính, PublicKeyToken = db937bc2d44ff139' hoặc một trong các phụ thuộc của nó. Một nỗ lực đã được thực hiện để tải một chương trình với định dạng không chính xác.

Thêm chi tiết lỗi ở phía dưới.

Nền tảng Giải pháp hoạt động của tôi là "Bất kỳ CPU" và tôi đang chạy trên x64 Windows 7 trên x64, tất nhiên, bộ xử lý. Lý do tại sao chúng tôi sử dụng phiên bản ELMAH này là vì 1.0 .Net 3.5 (x86, là nền tảng duy nhất được biên dịch) đã gây ra lỗi tương tự trên máy chủ Windows x64 của chúng tôi.

Tôi đã thử biên dịch cho x86 và x64 và tôi cũng gặp lỗi tương tự. Tôi đã thử loại bỏ tất cả đầu ra của trình biên dịch (bin và obj). Cuối cùng, tôi đã trực tiếp tham chiếu đến dll SQLite, một thứ không cần thiết cho dự án hoạt động trên máy chủ và tôi đã gặp lỗi trình biên dịch này:

Lỗi 1 Cảnh báo là Lỗi: Tạo hội - Tập hợp được tham chiếu 'System.Data.SQLite.dll' nhắm mục tiêu bộ xử lý khác MyProject

Bất kỳ ý tưởng vấn đề có thể là gì?

Thêm chi tiết lỗi:

Lỗi nguồn:

Một ngoại lệ chưa được xử lý đã được tạo trong quá trình thực hiện yêu cầu web hiện tại. Thông tin liên quan đến nguồn gốc và vị trí của ngoại lệ có thể được xác định bằng cách sử dụng dấu vết ngăn xếp ngoại lệ bên dưới.

Dấu vết ngăn xếp:

[BadImageFormatException: Không thể tải tệp hoặc tập hợp 'System.Data.SQLite, Version = 1.0.61.0, Culture = trung tính, PublicKeyToken = db937bc2d44ff139' hoặc một trong các phụ thuộc của nó. Một nỗ lực đã được thực hiện để tải một chương trình với một định dạng không đúng.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codebase, Bằng chứng assemblySecurity, hội locationHint, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly .nLoad (Lắp ráp tên tệp, String codeBase, Evidence assemblySecurance, hội địa điểmHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assugging.I InternalalLoad (Hội đồng tên lắp ráp Tải (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssuggingHelper (String assemblyName, Boolean starDirective) +46

[Cấu hìnhErrorsException: Không thể tải tệp hoặc lắp ráp 'System.Data.SQLite, Version = 1.0.61.0, Culture = trung tính, PublicKeyToken = db937bc2d44ff139' hoặc một trong các phụ thuộc của nó. Một nỗ lực đã được thực hiện để tải một chương trình với định dạng không chính xác.]
System.Web.Configuration.CompilationSection.LoadAss lanhHelper (String assemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.Load ALLAssembliesFrom .CompilationSection.LoadAssugging (HộiInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) + 232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildMan

[HttpException (0x80004005): Không thể tải tệp hoặc tập hợp 'System.Data.SQLite, Version = 1.0.61.0, Culture = trung tính, PublicKeyToken = db937bc2d44ff139' hoặc một trong các phụ thuộc của nó. Một nỗ lực đã được thực hiện để tải một chương trình với định dạng không chính xác.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web. Ứng dụng Trình quản lý ứng dụng Trình quản lý ứng dụng, IApplicationhosthosthost, IConfigMapPathFactory configMapPathFactory, HostingEn MôiParameter hostingParameter) +729

[HttpException (0x80004005): Không thể tải tệp hoặc tập hợp 'System.Data.SQLite, Version = 1.0.61.0, Culture = trung tính, PublicKeyToken = db937bc2d44ff139' hoặc một trong các phụ thuộc của nó. Một nỗ lực đã được thực hiện để tải một chương trình với một định dạng không đúng.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext ngữ cảnh) 8.896.783
System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext ngữ cảnh) 85
System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest wr ) +259


Nhật ký Fusion (liên kết lắp ráp) hữu ích hơn nhiều trong các trường hợp như vậy so với bảng theo dõi ngăn xếp này.
Anton Tykhyy

1
Có vẻ như vấn đề là Cassini là x86.
Pupeno

Tôi đã có cùng một vấn đề và phải từ bỏ ELMAH vì môi trường sản xuất / phát triển hỗn hợp mà chúng ta có. Cho rằng việc sử dụng SQLite trên máy chủ web sản xuất lưu lượng truy cập cao nghe có vẻ không tốt lắm và thực tế là SQLite dll là hội đồng duy nhất trong ELMAH buộc nó phải có hai phiên bản khác nhau cho các bit x86 và 64x, tôi tự hỏi tại sao các ELMAH lại kéo nó ra và làm cho nó tùy chọn hơn là những gì bây giờ.
Khash

Câu trả lời:


122

System.Data.SQLite.dlllà một tổ hợp hỗn hợp, tức là nó chứa cả mã được quản lý và mã gốc. Do đó, một cụ thể System.Data.SQLite.dlllà x86 hoặc x64, nhưng không bao giờ cả hai.

Cập nhật ( lịch sự J. Pablo Fernandez ): Cassini, máy chủ web phát triển được Visual Studio sử dụng khi bạn nhấn F5 hoặc nhấp vào nút «play» màu xanh lá cây, chỉ x86 có nghĩa là ngay cả khi máy trạm của bạn là x64, bạn sẽ chỉ có thể sử dụng phiên bản x86 của System.Data.SQLite.dll.

Một cách khác là không sử dụng Cassini mà là IIS7, đúng là x64.


3
Tôi đang sử dụng phiên bản x64 trên máy tính x64.
Pupeno

Bạn đã thử sử dụng phiên bản x86 chưa?
Anton Tykhyy

2
Một giải pháp thay thế mới có sẵn cách đây không lâu là sử dụng IIS Express cho phép bạn đặt loại nhóm ứng dụng bạn muốn sử dụng
Raul Vejar

@Raul Vejar: vui lòng giải thích cách tính năng lựa chọn nhóm ứng dụng của IIS Express giải quyết vấn đề lắp ráp 32 bit / 64 bit. Cảm ơn
Tim

@Tim, tính năng đó cho phép bạn chọn loại nhóm ứng dụng bạn muốn sử dụng, theo cách 32 hoặc 64 bit, theo cách đó bạn có thể kiểm soát khía cạnh đó đã được sửa trong Cassini và làm việc với cùng thư viện bit bạn có. Nói cách khác, nếu bạn đang sử dụng phiên bản 32 bit của dll SQLite, thì bạn nên chọn nhóm ứng dụng 32 bit trên IIS Express. Đối với phiên bản 64 bit của thư viện, bạn nên chọn nhóm ứng dụng 64 bit.
Raul Vejar

77

Đảm bảo rằng "Kích hoạt 32 - Ứng dụng bit" được đặt thành false cho nhóm ứng dụng.


2
Điều này hoạt động nếu bạn muốn sử dụng d86 x86 trên máy 64 bit. Trong trường hợp của chúng tôi, nhà phát triển và môi trường sản xuất của chúng tôi không phù hợp vì vậy đây là thứ hoạt động tốt nhất.
Cướp

17
Đặt nó thành đúng cho tôi thực sự giải quyết vấn đề. Tôi đoán các tàu Elmah với lắp ráp lite 32 bit theo mặc định.

1
+1 cho cả @Jirapong và Sergey vì đây là cài đặt này tôi phải thao tác để mọi thứ hoạt động. Trong trường hợp của tôi, tôi nghĩ rằng tôi đã có phiên bản x86 của SqlLite DLL và cần cho phép Ứng dụng 32 - Bit được đặt thành "true".
t3rse

43

Đi đến IIS7 Application Pool -> advanced settings and set the 32-bit application to true.


Tôi đang chạy windows 7 và tôi gặp phải vấn đề này; bật 32-bit đã sửa nó cho tôi, có lẽ vì bản sao DLL của tôi là 32 bit.
Doug

1
FYI: Cần phải đặt danh tính nhóm ứng dụng thành LocalSystem để hoạt động này: ^
Illuminati

Và đảm bảo có phiên bản Win32 của SQLite.Interop.dll stackoverflow.com/questions/4816529/ (
Morten Holmgaard

14

Điều này rất đơn giản nếu bạn không sử dụng SQLite:

Bạn có thể xóa các tệp SQLite khỏi các thư mục bin của giải pháp, sau đó từ thư mục nơi bạn tham chiếu ELMAH. Xây dựng lại và ứng dụng của bạn sẽ không thử tải DLL này mà bạn không sử dụng.


5
+1 Nếu bạn không sử dụng SQLite, vậy thì tại sao phải sửa lỗi DLL được tham chiếu? Đẹp, thanh lịch và chỉ những gì tôi cần.
bhavinb

Điều này hoạt động cục bộ nhưng sau đó tôi đã gặp lỗi sau khi triển khai lên Azure.
stuartdotnet

8

Tôi có một máy dev 64 bit và máy chủ xây dựng 32 bit. Tôi đã sử dụng mã này trước khi khởi tạo NHibernate. Làm say mê bất kỳ kiến ​​trúc nào (cả 2 tôi đã thử nghiệm)

Hy vọng điều này sẽ giúp được ai đó.

Hướng dẫn

        private static void LoadSQLLiteAssembly()
        {
            Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
            FileInfo fi = new FileInfo(dir.AbsolutePath);           
            string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL";
            if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false);
        }

        private static string GetAppropriateSQLLiteAssembly()
        {
            string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
            return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL";
        }

Có ai đã sử dụng thành công kỹ thuật này? Tôi đã thử nó trong một giải pháp ứng dụng asp.net mvc thử nghiệm và nó không hoạt động với tôi.
Glenn

1
Thay vì đi đến biến môi trường, bạn có thể sử dụng CLR trực tiếp: string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse

2
Hoặc thuộc tính Môi trường.Is64BitProcess (kể từ .NET4).
riezebosch

5

Trong trường hợp của chúng tôi không hoạt động vì máy chủ sản xuất của chúng tôi bị mất

Gói phân phối lại Microsoft Visual C ++ 2010 SP1 (x86)

Chúng tôi đã cài đặt nó và tất cả đều hoạt động tốt. Nhóm ứng dụng phải có Bật ứng dụng 32 bit thành đúng và bạn phải có phiên bản x86 của thư viện


1
Làm việc cho tôi. Nó chỉ đưa ra một thông báo lỗi mà không chỉ ra thư viện C bị thiếu, điều này thật tồi tệ.
brk

1
Đối với tôi, tôi đã cài đặt vcredist 2008 x64 cho System.Data.SQLite, Version = 1.0.99.0, Văn hóa = trung tính, PublicKeyToken = db937bc2d44ff139
themadmax

5

Là một người phải đối phó với khá nhiều báo cáo lỗi trên Roadkill Wiki với cùng một vấn đề, đây là điều bạn cần làm:

  • Bạn đang sử dụng x64 hay x86? Sqlite đi kèm với DLL cho các kiến ​​trúc riêng biệt - sao chép quyền vào thư mục bin của bạn, có hai DLL cho nhà cung cấp chính thức:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Nếu bạn không thể bận tâm săn lùng các hội đồng này, hãy bật chế độ 32 bit cho Nhóm ứng dụng của bạn (thường chỉ là giải pháp cho các nhà phát triển)
  • Nếu bạn đang lưu trữ trên máy chủ, bạn sẽ cần phân phối lại Microsoft C ++ Runtime - nó không được cài đặt trên Server 2008 R2 theo mặc định. phiên bản x64 , phiên bản x86

Đó là một nỗi đau thực sự khi bạn phải nhảy qua bao nhiêu lần khi phân phối lại các nhị phân SQLite .NET, giải pháp của tôi cho Roadkill cuối cùng là sao chép các nhị phân chính xác vào thư mục ~ / bin dựa trên kiến ​​trúc mà bạn sử dụng . Thật không may, điều đó không giải quyết được vấn đề thời gian chạy C ++.


5

Tôi đã giải quyết điều này bằng cách cài đặt System.Data.SQLite với phần mở rộng Nuget. Tiện ích mở rộng này có thể sử dụng cho Visual Studio 2010 trở lên. Đầu tiên, bạn phải cài đặt phần mở rộng Nuget. Bạn có thể theo dõi ở đây:

  • Chuyển đến Visual Studio 2010, Menu -> Công cụ
  • Chọn Trình quản lý tiện ích mở rộng
  • Nhập NuGet vào hộp tìm kiếm và nhấp vào Thư viện trực tuyến. Chờ đợi nó Lấy thông tin
  • Chọn Trình quản lý gói NuGet đã truy xuất, nhấp vào Tải xuống. Đang chờ nó Tải xuống
  • Nhấp vào Cài đặt trên Trình quản lý gói cài đặt mở rộng Visual Studio NuGet. Đợi quá trình cài đặt hoàn tất.
  • Nhấp vào Đóng và 'Khởi động lại ngay.

Thứ hai, bây giờ, bạn có thể cài đặt SQLite:

Và bây giờ, bạn có thể sử dụng System.Data.SQLite.

Trong trường hợp, bạn thấy hai thư mục x64 và x86, các thư mục này chứa SQLite.Interop.dll. Bây giờ hãy vào cửa sổ thuộc tính của các dll đó và thiết lập hành động xây dựng là nội dung và Sao chép vào thư mục đầu ra là Sao chép luôn.

Vì vậy, đó là cách của tôi.

Cảm ơn. Kim Tho Phạm, Thành phố Hồ Chí Minh, Việt Nam. Email: tho.phamkim @ gmail


4

Tải bằng tay liên quan System.Data.SQLite có thể giải quyết điều này.

Thay đổi mã của gatapia như sau:

    public static void LoadSQLLiteAssembly()
    {
        Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
        FileInfo fi = new FileInfo(dir.AbsolutePath);
        string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly());
        Assembly.LoadFrom(appropriateFile);
    }

    private static string GetAppropriateSQLLiteAssembly()
    {
        string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
        string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
        return "System.Data.SQLite.x" + arch + ".DLL";
    }

4

Tôi đã gặp lỗi này khi máy chủ windows của chúng tôi được chuyển đổi từ HĐH 32 bit thành 64 bit. Việc lắp ráp lỗi đã được đặt thành biên dịch ở chế độ x86 (tức là chế độ 32). Tôi đã chuyển nó thành "Bất kỳ CPU" và điều đó đã tạo ra mánh khóe. Bạn có thể thay đổi giá trị này bằng cách thực hiện như sau:

nhấp chuột phải vào dự án đi đến Properties -> Build -> Platform Target -> change to "Any CPU"


1
Tôi đã cố gắng sử dụng System.Data.SQLite.dll 32 bit và nhận được ngoại lệ này khi chạy trên cpu 64 bit. Tôi đã thay đổi mục tiêu nền tảng từ "Bất kỳ CPU" thành "x86" và nó đã khiến ngoại lệ biến mất. Tôi nghĩ trừ khi bạn đang tìm cách tối đa hóa hiệu suất, tốt hơn là xây dựng cho mẫu số ít phổ biến nhất để nó chạy trên cpu 32 hoặc 64 bit.
cdavidyoung

3

Tôi đã giải quyết điều này, thật kỳ lạ, bằng cách cài đặt System.Data.SQLite thông qua ứng dụng GUI Nuget, trái ngược với bảng điều khiển trình quản lý gói.

Cài đặt qua bàn điều khiển không bao gồm các phụ thuộc mà thư viện này cần chạy.


3

System.Data.SQLitecó sự phụ thuộc vào System.Data.SQLite.interopviệc đảm bảo cả hai gói đều giống nhau và đều là x86 .

Đây là một câu hỏi cũ, nhưng tôi đã thử tất cả các câu hỏi trên. Tôi đang làm việc trên một dự án x86 , vì vậy không có hai thư mục / x86, / x64. Nhưng vì một số lý do, đây System.Data.SQLitelà một phiên bản khác System.Data.SQLite.interop, một khi tôi kéo xuống các dll phù hợp thì vấn đề đã được khắc phục.


1

Tôi đã đưa ra 2 giải pháp nhanh chóng. Hoặc là làm việc cho tôi. Tôi nghĩ vấn đề là vì sự cho phép.

1) Thay vì sử dụng tệp Elmah.dll từ thư mục net-2.0, tôi đã sử dụng Elmah.dll từ net-1.1.

2) Thay vì giữ Elmah.dll trong thư mục bin dự án. Tôi làm một thư mục dll để đặt nó vào.


1

Một cách khác để khắc phục điều này chỉ là nâng cấp ứng dụng của bạn lên ELMAH 1.2 chứ không phải 1.1.


0

Bạn có thể xóa thư mục gỡ lỗi bin của bạn và biên dịch lại không?

Hoặc kiểm tra tham chiếu dự án của bạn đến System.Data.SQLite, theo dõi vị trí của nó, sau đó mở dll trong gương phản xạ. Nếu bạn không thể mở nó, điều đó có nghĩa là dll bị hỏng, bạn có thể muốn tìm một cái đúng hoặc cài đặt lại khung .net.


Tôi đã thử trực tiếp thêm tham chiếu vào System.Data.SQLite (ngoài việc xóa bin và obj) và tôi đã gặp lỗi này: Lỗi 1 Cảnh báo là Lỗi: Tạo hội - Lắp ráp tham chiếu 'System.Data.SQLite.dll 'nhắm mục tiêu bộ xử lý khác MyProject
Pupeno

0

Nếu bạn đang sử dụng IIS Express làm máy chủ web trên máy phát triển của mình, tôi sẽ đổi thành IIS cục bộ. Điều này làm việc cho tôi.


0

Đây là một bài viết cũ, nhưng nó có thể giúp một số người tìm kiếm lỗi này thử cài đặt "Bật ứng dụng 32 bit" thành True cho nhóm ứng dụng. Đó là những gì đã giải quyết lỗi cho tôi. Tôi đã tìm ra giải pháp này bằng cách đọc một số bình luận cho câu trả lời của @ beckelmw.


0

Bạn có thể đã cài đặt gói sai. Bạn muốn gói được sản xuất bởi Microsoft thực hiện mô hình nhà cung cấp System.Data.Common.

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.