'SQLite.Interop.dll' DLL yüklenemedi


206

Periyodik olarak aşağıdaki istisnayı alıyorum:

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

1.0.82.0 kullanıyorum. sürüm, VS2010, OS Win7 64 nuget ile yükleme.

İstisna görünmeye başladığında, sürekli olarak görünür - hata ayıklama ve VS içinde veya dışında uygulamayı serbest bırakma ve çalıştırma.

Durdurmanın tek yolu oturumu kapatmak ve oturum açmaktır. İstisna atılmaz ve dll yüklenir. Günlerce çalışabilir, ama sonra tekrar kırılabilir.

Kimse böyle bir şey gördü ve bunun için bir çözüm var mı?


2
Evet, her zaman kopyalanacak şekilde ayarlanmıştır. Ben bin / debug x64 ve x86 klasörleri var. Ve çoğunlukla işe yarıyor, ama bazen çalışmayı durduruyor. Muhtemelen bir şey dll erişimi engelliyor, bir dahaki sefere çalışmayı durdurmaya çalışacağız. Dediğim gibi günler sorunsuz çalışabilir.
xll

13
SQLite nuget paketini yeni bir konsol projesine ekledikten hemen sonra bu hatayı aldım. Elle SQLite.Interop.dll bir x86 klasöründen bir düzey yukarı kopyalayarak uygulamanın çalışmasına izin verir. Bana bu kadar kırılacak kadar garip geliyor.
lesscode

@Wayne Evet, bu kesinlikle yardımcı oluyor. Ama benim durumumda, proje üzerinde birlikte çalışıyoruz ve arkadaşım x86, ben x64 OS kullanıyor. Ve fark ettiğim gibi, bazen çalışmayı bırakır. Geçen ay başıma gelmemiş olmasına rağmen.
xll

1
SQLite için doğru ikili dosyayı karşıdan yüklerseniz, SQLite.Interop.dll dosyasını proje derleme seçeneğinize göre Release veya Debug klasörünüze kopyalayın.
Elshan

Bu çok rasgele bir hata ... bazen oluyor ve bazen projem için değil. Her şeyi denedim.
BK

Yanıtlar:


141

Partiye geç kaldığımı biliyorum ama bugün en son x86 / x64'ü (sürüm 1.0.88.0) indirdikten hemen sonra bu sorunu yaşadım. VS2012'deki yerel IIS'm varsayılan olarak 32bit çalışıyor ve x64'e geçmenin kolay bir yolu yok. Üretim sunucum 64bit çalışıyor.

Neyse, bir DLL projesine NuGet paketini kurdum ve bu hatayı aldım. Çalıştırmak için ne yapmam gerekiyorsa onu ana site projesine de kurmak zorunda kaldım . SQLite sınıflarına hiç dokunmasa bile.

Benim tahminime göre SQLite hangi Interop sürümünü yüklemek için giriş montaj kullanır.


11
NuGet ile SQLite Core referansını ana projeye ekledikten sonra benim için çalıştı.
Luca Cremonesi

Ana projeye sqllite.core eklemek benim için WPF
çözümümde

Db çağrıları bir kütüphanede olsa bile hem kurulum paketi Sqlite hem de Kurulum Paketi System.Data.SQLite.Core yapmak zorunda kaldım ...

Cevap bu olmalı.
Bobby Turkalino

4
"Ana site" projesi ile ne demek istiyorsun? Benim durumumda masaüstü çalışması yapıyorum. Şunu mu demek istediniz: "startup" projesi?
UuDdLrLrSs

60

Ben kullanıyordum bir dll bağımlılık olarak Sqlite vardı (NuGet sadece Sqlite çekirdek paketi ile yapılandırılmış) çünkü bu sorunu vardı. Proje 'SQLite.Interop.dll' (x86 ve x64 klasörü) dışında tüm Sqlite dll-s derler ve kopyalar.

Çözüm çok basitti: Sqlite.Core paketini, inşa ettiğiniz / çalıştırdığınız projeye (NuGet ile) bağımlılık olarak ekleyin ve dll-s kopyalanacaktır.


Benim için çalıştı! Teşekkürler
Tristan Djahel

Kabul. 'Sqlite.Net PCL' paketini kullanıyorum ama 'System.Data.SQLite Core (x86 / x64)' 'a da ihtiyacım olduğunu gördüm. Ayrıca, 'Any CPU' yerine 'x86' veya 'x64' Platform hedefini kullanmak için referans alan projeleri değiştirmek zorunda kaldım.
Andrew Stephens

2
Burada yayınlanan birkaç çözüm denedim, bu aslında en iyi çalıştı.
Batman

2
Böyle bir bağımlılığı nasıl ekleyebilirsiniz? hiç yapmadım (VS2013)
jpgrassi

3
Araçlar -> NuGet Paket Yöneticisi -> Çözüm için NuGet Paketlerini Yönet ... -> Çevrimiçi -> Tümü seçeneklerine gidin. Sonra sqlite arayın ve System.Data.SQLite Core (x86 / x64) ekleyin.
Marin

44

Platform hedefi olan bir WPF projesinde SQLite kullanırken aynı sorunu yaşadım Any CPU. Aşağıdaki adımları izleyerek düzelttim:

  1. Proje tasarımcısını Visual Studio'da açın. Bunun nasıl yapılacağıyla ilgili ayrıntılar burada bulunabilir .
  2. Oluştur sekmesini tıklayın.
  3. prefer 32-bitSeçeneği devre dışı bırakın .

Alternatif olarak, yalnızca platform hedefini x86veya olarak ayarlayabilirsiniz x64. Bu soruna System.Data.SQLite'SQLite.Interop.dll' dosyasının konumunu almak için platform hedefini kullanan kitaplıktan kaynaklandığını düşünüyorum .

GÜNCELLEME:

Proje tasarımcısı ulaşılamazsa durumda, sadece proje (açık *.csprojbir metin editörü itibaren) dosyası ve değer katmak <Prefer32Bit>false</Prefer32Bit>içine <PropertyGroup>...</PropertyGroup>etiketi.

Örnek kod

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

VS 2010 kullanıyorum, böyle bir seçenek yok.
xll

@xll, cevabı açıklığa kavuşturmak için düzenledim. Düzenlemenin bir şeyleri temizleyip temizlemediğini kontrol edin.
Caleb Kiage

10
VS2012'de bu seçenek benim için grileşir.
Kugel

6
Seçenek yalnızca EXE projelerinde etkinleştirilir, ancak çoğumuzun birim test projelerinde bu sorunu yaşadığımızı düşünüyorum.
Brannon

1
VS Pro 2015'te bir WPF projesinde benim için grileşti. .csprojDosya falsezaten ayarlanmıştı , ancak yine de hata vardı.
vapcguy

32

Projemde böyle düzelttim.

Çalışıyordu ve bir meslektaşım yaptığı değişiklikleri gönderdiğinde, "DLL 'SQLite.Interop.dll' yüklenemedi" özel durumu aldım.

Projenin .csproj dosyasını değiştirerek, bu ÇALIŞMAYAN sürümdeydi:

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

Ve ÇALIŞMA sürümü bu vardı:

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

Geri döndükten sonra, istisna almadım. DLL dosyaları uygun Debug \ x64 (etc) klasörlerine dökülmüştür.


"SQLite.Interop.dll" için <itemgroup> projenin .csproj dosyasında yoktur. hala çözüm eklemek için çalıştı ama işe yaramadı :(
ayc

Bu VS2012'de çalışmaz, öğeler mevcut değildir.
htm11h

Çok teşekkür ederim. 2015 vs Çalışmaları
Jevgenij Kononov

31

Bu nedenle, NuGet eklendikten sonra dağıtım Interops'u kopyalamaz. Bunu csproj dosyanıza ekleyebilirsiniz ve bu davranışı düzeltmesi gerekir:

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

SQLite için NuGet kaynağına bakarsanız, bunların ne yaptığını görebilirsiniz. Bu ASP.Net Core ile çalışan bir konuşlandırma almamı sağladı.


10
ContentSQLiteInteropFiles yanıttır. En iyi cevapların çoğu tahminidir.
Corey Alix

6
Evet, cevap ContentSQLiteInteropFiles. 1. Bu kabul edilen cevap olmalıdır 2. Öte yandan, bir nuget paketi olarak bu çalışmanın otomatik olarak nasıl yapılacağını veya en azından bu yapılandırma ihtiyacını belgelediği araştırılmalıdır.
gerleim

Kabul edilen cevap olmalı. Çok basit. 1. proje boşalt 2. csproj yukarıdaki projeyi 3. ekleyin. bu kadar kolay ...
BillRuhl

24

Bu duruma geldiğinizde, Tümünü Yeniden Oluştur'u deneyin. Bu sorunu çözerse, yaşadığım aynı sorunu yaşayabilirsiniz.

Bazı bilgiler (benim anlayışım) :

  • SQLite 1 yönetilen derleme (System.Data.SQLite.dll) ve birkaç platforma özel derleme (SQLite.Interop.dll) vardır. Nuget ile SQLite kurarken, Nuget projenize platforma özel montajları ekler (birkaç klasör içinde: \ x86, \ x64) ve bu dll'leri "Her Zaman Kopyala" olarak yapılandırır.

  • Yüklendiğinde, yönetilen derleme \ x86 ve \ x64 klasörlerindeki platforma özgü derlemeleri arar. Burada daha fazlasını görebilirsiniz . İstisna, bu yönetilen derleme ilgili (SQLite.Interop.dll) bu klasörler içinde (ve başarısız) bulmaya çalışırken olmasıdır.

Senaryom :

Çözümümde 2 proje var; bir WPF uygulaması ve bir sınıf kütüphanesi. WPF uygulaması sınıf kitaplığına ve sınıf kitaplığı SQLite'a (Nuget üzerinden yüklenir) başvurur.

Benim için sorun sadece WPF app, VS kısmi bir yeniden yapmaya çalışır (bağımlı dll değişmedi fark) oldu. Bu işlemin bir yerinde VS, \ x86 ve \ x64 klasörlerinin (SQLite.Interop.dll dosyasını uçuruyor) içeriğini temizler. Tam Yeniden Oluşturma işlemi yaptığımda, VS klasörleri ve içeriklerini doğru bir şekilde kopyalar.

Çözümüm :

Bunu düzeltmek için, xcopy kullanarak \ x86 ve \ x64 klasörlerini sınıf kitaplığından WPF proje \ bin dizinime kopyalamaya zorlamak için bir Post-Build işlemi ekledim.

Alternatif olarak, build configuration / output dizinleri ile daha ince şeyler yapabilirsiniz.


1
Aldığım mesaj bu dosyaların eksik olduğunu söylüyordu ama bunun bir izin sorunu olduğunu düşündüm. Mesajınızı gördükten sonra, konuşlandırdığım zaman sunucuya asla ulaşmadıklarını fark ettim.
Stradas

1
Neredeyse özdeş çözümüm, başlangıç ​​projeme x86 ve x64 klasörlerini eklemek, ardından ilgili klasörlerine x86 birlikte çalışma ve x64 birlikte çalışma dosyalarını eklemekti. Dosyaların seçeneğini "içerik" ve "her zaman oluştur" olarak ayarladım. Uygulamayı diğer bilgisayarlara ClickOnce ile dağıttığımda Windows Forms uygulamamın gömülü s3db veritabanı dosyasına bağlanmasını sağlayabilmemin tek yolu bu. Sinir bozucu bir şekilde, uygulamayı bilgisayarımda geliştirip test ettiğimde SQLite hatası almadım.
David Alan Condit

VS 2017 ile hala oluyor: '(
wmebane

1
Bu, sorunumu anlamama yardımcı olan cevap, ancak düzeltmem biraz farklı olsa da. Benim sorunum system.data.Sqlite.dll el ile ekledi olmasıdır. Bu şekilde, Sqlite.Interop.dll otomatik olarak \ x86 ve x64'e kopyalanmaz. Çözüm, referansı silmek ve Nuget tarafından eklemek.
Susan Wang

19

Visual Studio Express 2013'ü çalıştırırken de aynı sorunu yaşadım. Burada ve başka yerlerde boşuna bulunmayan birkaç çözüm denedim. Umarım bu düzeltme başkalarına yardımcı olur.

Ben SQLite tabanlı hizmet sınama benim test sınıf DeploymentItemözniteliği kullanarak düzeltildi .

Misal:

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

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

Bu, gerekli "TestResults" klasörü içindeki dizine SQLite.Interop.dllkopyalanmasına neden olur x86.

Hepsi yeşil. Her şey yolunda.


1
Bu çözüm yalnızca Microsoft.VisualStudio.TestTools.UnitTesting ad alanını kullanıyorsanız çalışır
sapbucket

4
MSTest kullanıyorsanız bu doğru bir çözümdür. Bir test için DeploymentItem ("some.csv") kullanılana kadar SQLite sorunsuz bir şekilde SQLite.Interop.dll bulma çalıştı. Bu şekilde .csv dosyası eklenmesi, MSTest'i başvurulan tüm dll'leri TestResults dizinine kopyalamak için tetikledi. SQLite.Interop.dll projede başvuru yapmadığından (ve yönetilmeyen koddan bu yana kullanılamadığından), hiçbir zaman kopyalanmadı.
Johann

En iyi seçeneğiniz, her mimari için bir tane olmak üzere iki satır eklemektir. Bu, test çalıştırıcısının 64 bit çalıştırması durumunda sizi korur.
Kirk Woll

13

Tools -> Extension and updatesNuGet'in güncellenmesi ve SQLite.Core'un yeniden kurulması komutu PM> Update-Package -reinstall System.Data.SQLite.Corebenim için düzeltildi.


Bunu yaparken bir hata alırsanız, SQLite DLL'lerini / referanslarımı kaldırıp nuget'den tamamen yeniden yüklemek benim için hile yaptı
KayakinKoder

sqllite çekirdek yardımı da bana yeniden yükleyin. VS2012'de gerçekleşti. VS, web dağıtım paketine x62 sürümünü dahil etmedi
Andrey R

VS2015 Professional'da benim için de düzeltildi.
Rahul Kishore

9

Birden fazla proje çözümünde de benzer bir sorun yaşadım. SQLite.Interop.dll, ClickOnce kullanarak yazılımla dağıtılan eklentilerden biri için gerekliydi.

Visual Studio'da hata ayıklama kadar her şey iyi çalıştı, ancak konuşlandırılmış sürümü o DLL içeren x86 / ve x64 / klasörleri eksikti.

ClickOnce kullanarak dağıtımdan sonra çalışmasını sağlayacak çözüm, çözümün başlangıç ​​projesinde (aynı zamanda yayınlanmakta olan) bu iki alt klasörü oluşturmak, DLL'lere kopyalamak ve Her Zaman İçerik Kopyası olarak ayarlamaktı.

Bu şekilde ClickOnce yayınlama aracı bu dosyaları ve klasörleri otomatik olarak manifest'e dahil eder ve yazılımı onlarla birlikte dağıtır


1
Bu benim için çalışan tek çözüm oldu ... ve oğlan .. Uygulamanız sadece bir kullanıcının bilgisayarında kapatıldığında hata ayıklamak için bir acı oldu.
stoic

8

Burada gerçekten çok cevap var, ama benim GAC oynamadığım için basit ve açık .

Sorun, yürütülebilir dosyanın SQLite.Interop.dllveritabanımıza erişmek için sağ bir kopyaya (x86 veya x64) ihtiyacı olmasıydı .

Çoğunlukla mimarilerin katmanları vardır ve benim durumumda Veri Katmanı SQLite Bağlantısı için gerekli DLL'ye sahiptir.

Bu yüzden benim Veri Katmanı Çözüm içine basit bir yazı inşa komut koymak ve her şey iyi çalıştı.


TL; DR;

  1. Çözümünüzün tüm Projelerini derleme seçeneklerine x86veya x64derleme seçeneklerine ayarlayın.

  2. Aşağıdakileri Post-Build-Scriptiçeren Projeye aşağıdakileri ekleyin SQLite nuget Package:

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

Elbette betiği değiştirmeli Release Buildve x86derlemelisiniz.


STL; DR;

Dosyanızın SQLite.Interop.dllyanına koyun *.exe.


6

NuGet'in SQLite çoklu mimari (x86, x64) sürümünün varsayılan yüklemesi, açıkladığınız davranışı gösterir. .NET çalışma zamanının uygulamanızı makinenizde çalıştırmayı seçtiği gerçek mimari için doğru sürümü yüklemek isterseniz, DLL yükleyicisine aşağıdaki gibi doğru kitaplığın nerede bulunacağı hakkında bir ipucu verebilirsiniz:

Program.Main () öğesinden önce SetDLLDirectory () öğesine kernel32.dll işlev çağrısı için bir bildirim ekleyin:

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

Ardından, 'SQLite.Interop.dll'nin mimariye özgü sürümünü bulmak için doğru alt dizini belirlemek için kendi yönteminizi kullanın. Aşağıdaki kodu kullanıyorum:

    [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

Eski bir gönderi olsa bile, burada bulduğum çözümü paylaşmak istiyorum: http://system.data.sqlite.org/index.html/info/54e52d4c6f

Tüm sorunu okumak istemiyorsanız, çözüm "msvcr100.dll" dosyasını (Windows \ System32 dizininde bulunabilir) SQLite.Interop.dll ile aynı yola kopyalamaktır.

Nedenini anlamak ve dosyayı kurulumunuza dahil etmek için sorunu okumanızı tavsiye ederim, ancak yalnızca hata oluştuğunda yüklemek için, kurulum seçeneklerinde seçilebilir bir bileşen yaptım.

HTH, Formentz


Bunun için çok teşekkürler, her şeyi denedim ve çözüm
buydu

4

As SQLite wiki diyor, başvurunuz dağıtım olmalıdır:

Uygulama dağıtımı

Bu yüzden kurallara uymalısınız. Hedef platformunuzla eşleşen dll'yi bulun ve yerine yerleştirin, resimde açıklanır. Dll dosyaları YourSolution / Packages / System.Data.SQLite.Core.% Version% / dizininde bulunabilir.

Uygulama dağıtımıyla ilgili sorunlar yaşadım, bu yüzden projeme doğru SQLite.Interop.dll'yi ekledim, kurulum projesinde AppplicationFolder'a eklenen x86 klasörü ve dll'ye dosya referansları ekledim.


3

64 bit projede 32 bit dll çalıştırmaya çalışıyorsanız da bu hatayı alabilirsiniz.

Hem x86 hem de x64 klasörüne aynı dosyayı (32 bit sürümünde SQLite.Interop.dll) yerleştirdiğinizde bunu aldım.


3

Eğer varsa doğru ikiliyi indirmek için SQLitedaha sonra kopya SQLite.Interop.dllsenin içine Yayın veya hata ayıklama proje inşa seçeneğine göre klasörde.


3

Bunun neden henüz dahil edilmediğini bilmiyorum, ama araştırmayı yapmak ve bunu kendim bulmak zorunda kaldım, bu yüzden umarım birisi bu cevabı bulabilir ve beladan kurtulur. Bu bir WPF uygulaması içindi. Dev kutumda iyi çalıştı, ancak kopyaladığım bilgisayarda çalışmadı ve Unable to load DLL 'SQLite.Interop.dll'hatayı aldım . Ben koştuğumda OP ile aynı hatayı aldığımda, ilişkili tüm dizinleri ve dosyaları doğrudan "Hata ayıklama" klasöründen bu diğer bilgisayara taşıdım. DLL'lerimi içeren "bin" klasörüm "Hata ayıklama \ bin" klasörüne kopyalanmıştı ve bu yolu kullanarak diğer bilgisayara kopyalama yaptığım zaman uygulama dosyaları ile birlikte dahil edildi, bu yüzden herhangi bir dosya eksik değildi.

Uygulanmayan diğer cevaplarda gördüğüm şeyler:

  • NuGet paketini kullanmadım veya NuGet paketinin oluşturduğu anlaşılan x86 veya x64 klasörleri oluşturmam gerekiyor. DLL'lerim (System.Data.SQLite ve SQLite.Interop.dll, System.Data.SQLite.config ile birlikte) projemdeki "bin" klasöründedir ve manuel olarak kopyalanmıştır (Solution Explorer'da "bin" klasörü oluştur VS, DLL dosyalarını Windows Gezgini'nde bu klasöre yapıştırın, dosyaları VS klasörüne / projesine getirmek için Ekle> Mevcut Öğe'yi kullanın). Daha sonra bu konumu kullanarak projemdeki Referanslı Montajlar olarak referansta bulunuyorum ("Referanslar"> "Referans Ekle" ve bir tanesine göz atın, durulayın, geri kalanı için tekrarlayın ). Bu, projemin tam olarak nerede olduklarını bilmesini sağlar.
  • Benim app.config dosyasında herhangi bir SQLite DLL dosyasına başvurmam, hatta MyProject.csproj dosyama dokunmam gerekmedi.
  • Belirli bir işlemci belirtmem bile gerekmiyordu! Sadece karışık veya 64 bit DLL'leri olmasına ve yalnızca 64 bit işletim sistemi olan Windows 7+ üzerinde çalışmasına rağmen, projemin yapısı "Herhangi bir CPU" içindir. (yalnızca x86 / 32 bit yalnızca DLL yok)
  • OP hatası yaşadığımda bunları zaten "İçerik" ve "daha yeni ise kopyala" olarak belirtiyordum.

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

(11) Uygulamamı çalıştırmaya çalışırken neden DllNotFoundException ("sqlite3.dll" veya "SQLite.Interop.dll" için) alıyorum?

Adı belirtilen dinamik bağlantı kitaplığı (DLL) bulunamıyor veya eksik bağımlılıklar nedeniyle yüklenemiyor. Adı belirtilen dinamik bağlantı kitaplığının uygulama dizininde veya sistem PATH'si boyunca bir dizinde bulunduğundan emin olun ve tekrar deneyin. Ayrıca, statik olarak bağlanmış bir dinamik bağlantı kitaplığı kullanmıyorsanız , gerekli Visual C ++ çalışma zamanı yeniden dağıtılabildiğinden emin olun .

Paragrafın içindeki bu cesur kısım vurgu. Hedef bilgisayar yeni ve .NET 4.0 dışında yüklü programları yoktu. C ++ 'ı kurduktan sonra, SQLite komutlarını tamamlayabildi. Bu, ilk SSS'lerden biri ve ön gereksinimlerin bir parçası olmalı, ancak # 11'de gömüldü. Geliştirme bilgisayarım Visual Studio ile birlikte geldiğinden zaten yüklenmişti, bu yüzden orada çalıştı.

İndir:
Visual Studio 2015 için Visual C ++ Yeniden Dağıtılabilir:
https://www.microsoft.com/en-us/download/details.aspx?id=48145

Güncelleme 3 (toplu güncelleme):
https://www.microsoft.com/en-us/download/details.aspx?id=53587


3

Costura.Fody (.net) derlemelerini paketlemek ve yerleşik dll'leri yerleştirmek ve önceden yüklemek için kullanmaya başladım. Bu, daha sonra bir dosya gönderebileceğiniz için dağıtımda da yardımcı olur.

  1. Nuget'ten Costura Fody'yi yükleyin.

  2. C # projenizde costrua32 adlı bir klasör oluşturun. Orada hangi C # yüklemek için herhangi bir yerel dll ekleyin.

  3. Bunları bu klasöre ekledikten sonra. Özellikler penceresine tıklayın ve derleme eylemini "Gömülü Kaynak" olarak değiştirin

  4. Son olarak FodyWeavers.xml adlı XML dosyasını aşağıdaki gibi değiştirmeniz gerekir. Burada ilk yük sql dll belirtiyorum. (.dll dosyasını bıraktığınızı unutmayın)

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

Bunun avantajı, herhangi bir ön veya son oluşturma olayı yazmak zorunda kalmamanız ve son ürünün tamamen daha büyük bir dosyada kapsüllenmesidir.


Klasör adı costura32, github.com/Fody/Costura#native-libraries-and-preloadorder belgesi olmalıdır
Elton Saunders

3

Ayrıca dll test projesine (Nuget Manager aracılığıyla) eklendi ve düzeltildi.


2

Visual C ++ 2010 yeniden dağıtılabilir hiçbir PC'imde yüklü olduğu için bu sorun vardı. Visual c ++ 2010 yeniden dağıtılabilir henüz yüklemediyseniz indirin ve yükleyin (kontrol x86 veya 64 dll).


Evet. Bu da benim durumumdu ... sadece benimki Visual C ++ 2010 yeniden dağıtılabilir SP1 gerektiriyordu. En iyi ruh hali, sürümünüz için hangi çalışma zamanının gerekli olduğunu dikkatlice okumaktır. Örneğin burada: system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Velja Radenkovic


2

Ben de aynı problemi yaşadım. Ancak nihayet düzeltebilirim. Şu anda Visual Studio 2013 Topluluk Sürümünü kullanıyorum. Sadece Ekle-> Varolan Öğe ... kullanın ve SQLite.Data.SQLite dosyalarının bulunduğu yere göz atın (benim durumum 'C: \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin'). Lütfen Montaj Dosyalarına ne ekleyeceğinizi değiştirmeyi unutmayın (* .dll; * .pdb) . Bu klasörde ' SQLite.Interop.dll'yi seçin . Oradan ve daha sonra hiç sorun yaşamadan devam edebilirim. Hepinize iyi şanslar. ^ _ ^ PS Web formu uygulaması oluşturuyorum. Henüz pencere formu uygulamasında veya başkalarında denemedim.


2

Oluşturmadan önce platform hedefini x86 veya x64 (ve Herhangi Bir CPU değil) olarak ayarlamaya çalışın: Visual Studio'da Project-> Properties-> Build-> Platform hedefi.


2

SQLite.Interop.dll dosyasını proje dizinine kopyalayın.

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

Sorunu çözmek için Bin dosyasına IIS_APPPOOL Düzenleme izinleri vermek zorunda kaldım. Sadece ddl kopyalamak dll bir Erişim Reddedildi neden oldu
AlexanderD

Bu dosyayı eklemek sorunları çözdü, ancak bu geçici bir çözüm.
Kartik Goyal

2

Bununla uzun süre mücadele ettim ve bazen test ayarının yanlış olduğunu buldum. Bu resme bakın: Test ayarı

Sadece test ayarının işaretini kaldırıyorum ve sorun kayboluyor. Aksi takdirde, istisna oluşur. Umarım, bu birisine yardımcı olacaktır. Bunun temel nedeni olduğundan emin değilim.


1
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir. - Yorumdan
Robert Columbia

Benim durumumda, testsettings dosyası yanlış: <TestSettings ... <Deployment> <DeploymentItem dosyaadı = "bin \ Relase \ a.test.dll". dosya konumu yanlış yapılandırılmış.
Tony Sun

2

Hata ayıklama klasöründe x86 ve x64 için "SQLite.Interop.dll" dosyalarını kopyalayın. bu dosyalar hata ayıklama klasöründeki "x86" ve "x64 klasörlerine kopyalanmalıdır.


2

Benim uygulama bir web uygulaması (ASP.NET MVC) ve LocalSystemyerine altında çalıştırmak için uygulama havuzunu değiştirmek zorunda kaldı ApplicationPoolIdentity. Bunu yapmak için:

  1. IIS Yöneticisi'ni açın
  2. Sitenizin altında çalıştığı Uygulama Havuzunu bulun.
  3. İşlemlerden Gelişmiş Ayarlar'ı tıklayın.
  4. Kimliği Değiştir LocalSystem

Bunun neden sorunu çözdüğüne dair hiçbir fikrim yok.


2

eski proje dosya biçimi

yani ile başlayan projeler <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

Aşağıdakileri "ana" / kök projenizdeki csproj'unuza ekleyin

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

yeni SDK proje dosya formatı

yani ile başlayan projeler <Project Sdk="Microsoft.NET.Sdk.*">

PrivateAssets="none"Bağımlılık zincirindeki her ProjectReference / PackageImport öğesine System.Data.Sqlite PackageImport öğesine ekleyin

örn:

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

çıkış başarıyla göster: Dosyayı ".. \ Packages \ System.Data.SQLite.Core.1.0.105.2 \ build \ net451 \ x64 \ SQLite.Interop.dll" klasöründen "XXProject \ release \ x64 \ SQLite.Interop.dll dosyasına kopyalanıyor ". ".. \ Packages \ System.Data.SQLite.Core.1.0.105.2 \ build \ net451 \ x86 \ SQLite.Interop.dll" den "XXProject \ release \ x86 \ SQLite.Interop.dll" dosyasına dosya kopyalanıyor.
John_J

Lütfen EVBD bu çözümü kullanın ve asla sadece dll manuel kopyalama!
John_J

1

Bunun iyi bir cevap olup olmadığını bilmiyorum, ancak uygulamamı "Yerel Sistem" kimliğine sahip bir AppDomain altında çalıştırarak çözebildim.


1

Bir SQLite veritabanına bazı test verileri eklemek için basit bir konsol uygulaması üzerinde çalışıyorum ve bu hatayı alıyordum. Projenin yapılandırması "Herhangi bir CPU" dur. Ben SQLite.Interop.dll bin \ debug klasörüne kopyalayarak düzeltti. Daha iyi bir yol yöntemi @Wil tarafından kullanmak olabilir, ancak bunu "Herhangi bir CPU" yapılandırması için nasıl belirtirsiniz?


1

Meclis için çekişme olabilir mi? DLL üzerinde dosya kilidi olan başka bir uygulama olup olmadığını kontrol edin.

Sebep bu ise , rahatsız edici programı bulmak için Sysinternal'ın İşlem Gezgini gibi bir araç kullanmak kolay olmalıdır .

HTH, Kil


1

Bu soruya bakan herkese referans için:

Nuget paketini kullanırsanız, kopyalamayı sizin için yapan bir oluşturma kuralı yükler. (bkz. System.Data.SQLite.Core.1.0.94.0 \ build - veya yüklediğiniz herhangi bir Core sürümü).

Nuget yükleyici kuralı proje dosyanıza otomatik olarak ekler.

Bu yine de test senaryosu problemini çözmez. DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) yaklaşımı, orada çalışıyor gibi görünen tek şeydir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.