ไม่สามารถโหลด DLL 'SQLite.Interop.dll'


205

ฉันได้รับข้อยกเว้นต่อไปนี้เป็นระยะ:

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

ฉันใช้ 1.0.82.0 เวอร์ชั่นติดตั้งด้วย nuget ใน VS2010, OS Win7 64

เมื่อข้อยกเว้นเริ่มปรากฏขึ้นจะปรากฏขึ้นอย่างต่อเนื่อง - ในการดีบักและปล่อยและเรียกใช้แอปพลิเคชันภายในหรือภายนอก VS

วิธีเดียวที่จะหยุดมันคือออกจากระบบและเข้าสู่ระบบ ข้อยกเว้นไม่ถูกส่งออกไปและโหลด dll มันสามารถทำงานได้หลายวัน แต่ก็สามารถทำลายได้อีกครั้ง

มีใครเห็นบางสิ่งเช่นนี้และมีวิธีแก้ปัญหาหรือไม่


2
ใช่มันถูกตั้งค่าให้คัดลอกเสมอ ฉันมี x64 และ x86 โฟลเดอร์ใน bin / debug และใช้งานได้เป็นส่วนใหญ่ แต่บางครั้งก็หยุดทำงาน อาจเป็นสิ่งที่ปิดกั้นการเข้าถึง dll ฉันจะพยายามหามันในครั้งต่อไปที่มันหยุดทำงาน อย่างที่ฉันบอกว่ามันอาจจะทำงานได้หลายวันโดยไม่มีปัญหา
xll

13
ฉันได้รับข้อผิดพลาดนี้ทันทีหลังจากเพิ่มแพ็คเกจ SQLite nuget ไปยังโครงการคอนโซลใหม่ คัดลอก SQLite.Interop.dll ด้วยตนเองจากโฟลเดอร์ x86 ขึ้นหนึ่งระดับทำให้แอปสามารถเรียกใช้ ดูเหมือนจะแปลกสำหรับฉันว่ามันจะพัง
lesscode

@ เวย์นใช่นี่ช่วยได้แน่นอน แต่ในกรณีของฉันเรากำลังทำงานร่วมกันในโครงการและเพื่อนของฉันใช้ x86 ในขณะที่ฉัน x64 OS และเมื่อฉันสังเกตเห็นมันก็หยุดทำงานในบางครั้ง แม้ว่ามันจะไม่ได้เกิดขึ้นกับฉันเมื่อเดือนที่แล้ว
xll

1
หากคุณดาวน์โหลดไบนารีที่ถูกต้องสำหรับ SQLite ให้คัดลอก SQLite.Interop.dll ลงในโฟลเดอร์ Release หรือ Debug ตามตัวเลือกบิลด์โครงการของคุณ
Elshan

นี่เป็นข้อผิดพลาดแบบสุ่ม ... บางครั้งมันเกิดขึ้นและบางครั้งมันก็ไม่เหมาะกับโครงการของฉัน พยายามทุกอย่าง
BK

คำตอบ:


140

ฉันรู้ว่าฉันมางานปาร์ตี้ช้า แต่ฉันมีปัญหานี้หลังจากที่ฉันดึง x86 / x64 ล่าสุดลงวันนี้ (เวอร์ชั่น 1.0.88.0) IIS ท้องถิ่นของฉันใน VS2012 รัน 32 บิตโดยค่าเริ่มต้นและไม่มีวิธีง่ายๆในการเปลี่ยนเป็น x64 เซิร์ฟเวอร์ที่ใช้งานจริงของฉันใช้งาน 64 บิต

ฉันติดตั้งแพคเกจ NuGet ไปยังโครงการ DLL และฉันได้รับข้อผิดพลาดนี้ สิ่งที่ฉันต้องทำเพื่อให้มันใช้งานได้ฉันต้องติดตั้งกับโครงการหลักของไซต์ด้วย แม้ว่ามันจะไม่ได้สัมผัสคลาส SQLite เลย

ฉันเดาว่า SQLite ใช้แอสเซมบลีรายการเพื่อตรวจสอบรุ่นของ Interop โหลด


11
มันใช้งานได้สำหรับฉันหลังจากที่ฉันเพิ่มการอ้างอิงไปยัง SQLite Core ด้วย NuGet ในโครงการหลัก
Luca Cremonesi

การเพิ่ม sqllite.core ให้กับโครงการหลักใช้ได้สำหรับฉันในโซลูชัน WPF ของฉัน
Dipu Raj

ฉันต้องทำทั้งการติดตั้งแพคเกจ Sqlite เช่นเดียวกับการติดตั้งแพคเกจ System.Data.SQLite.Core ในเว็บไซต์ของฉันแม้ว่าการเรียก db อยู่ในห้องสมุด ...

นี่ควรเป็นคำตอบ
Bobby Turkalino

4
คุณหมายถึงอะไรในโครงการ "ไซต์หลัก" ในกรณีของฉันฉันกำลังทำงานเดสก์ท็อป คุณหมายถึงโปรเจ็กต์ "เริ่มต้น" หรือไม่
UuDdLrLrSs

60

ฉันมีปัญหานี้เพราะ dll ที่ฉันใช้มี Sqlite เป็นการพึ่งพา (กำหนดค่าใน NuGet ด้วยแพคเกจหลักของ Sqlite เท่านั้น) โครงการรวบรวมและคัดลอก Sqlite dll-s ทั้งหมดยกเว้น 'SQLite.Interop.dll' (ทั้งโฟลเดอร์ x86 และ x64)

วิธีการแก้ปัญหานั้นง่ายมาก: เพียงแค่เพิ่มแพ็คเกจ Sqlite.Core เป็นการอ้างอิง (กับ NuGet) ให้กับโครงการที่คุณกำลังสร้าง / รันและ dll-s จะถูกคัดลอก


ทำงานให้ฉัน! ขอบคุณ
Tristan Djahel

ตกลง ฉันใช้แพ็คเกจ 'Sqlite.Net PCL' แต่พบว่าฉันต้องการ 'System.Data.SQLite Core (x86 / x64)' ด้วย ฉันต้องเปลี่ยนโครงการที่อ้างถึงเพื่อใช้เป้าหมายแพลตฟอร์มเป็น 'x86' หรือ 'x64' มากกว่า 'Any CPU'
Andrew Stephens

2
พยายามแก้ปัญหาบางอย่างที่โพสต์ที่นี่วิธีนี้ได้ผลดีที่สุด
แบทแมน

2
คุณจะเพิ่มการพึ่งพาเช่นนั้นได้อย่างไร ไม่เคยทำเลย (VS2013)
jpgrassi

3
ไปที่เครื่องมือ -> ตัวจัดการแพ็คเกจ NuGet -> จัดการแพคเกจ NuGet สำหรับโซลูชัน ... -> ออนไลน์ -> ทั้งหมด จากนั้นค้นหา sqlite และเพิ่ม System.Data.SQLite Core (x86 / x64)
Marin

44

ฉันมีปัญหาเดียวกันนี้เมื่อใช้ SQLite ในโครงการ WPF Any CPUที่มีเป้าหมายเป็นแพลตฟอร์ม ฉันแก้ไขมันโดยทำตามขั้นตอนต่อไปนี้:

  1. เปิดตัวออกแบบโครงการใน Visual Studio รายละเอียดเกี่ยวกับวิธีการทำก็สามารถพบได้ที่นี่
  2. คลิกที่แท็บสร้าง
  3. ปิดการใช้งานprefer 32-bitตัวเลือก

หรือคุณก็สามารถตั้งเป้าแพลตฟอร์มที่จะหรือx86 x64ฉันคิดว่าปัญหานี้เกิดจากSystem.Data.SQLiteไลบรารีที่ใช้แพลตฟอร์มเป้าหมายเพื่อรับตำแหน่งของไฟล์ 'SQLite.Interop.dll'

UPDATE:

ในกรณีที่ไม่สามารถเข้าถึงผู้ออกแบบโครงการเพียงแค่เปิดไฟล์ project ( *.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>

ฉันใช้ VS 2010 ไม่มีตัวเลือกดังกล่าว
xll

@xll ฉันแก้ไขคำตอบเพื่อความกระจ่าง ตรวจสอบว่าการแก้ไขล้างข้อมูลหรือไม่
Caleb Kiage

10
ใน VS2012 ตัวเลือกนี้เป็นสีเทาสำหรับฉัน
Kugel

6
ตัวเลือกนี้เปิดใช้งานเฉพาะในโครงการ EXE แต่ฉันคิดว่าพวกเราส่วนใหญ่มีปัญหากับโครงการทดสอบหน่วย
Brannon

1
เป็นสีเทาสำหรับฉันในโครงการ WPF ใน VS Pro 2015 .csprojไฟล์ตั้งค่าเป็นfalseแล้ว แต่ยังคงมีข้อผิดพลาด
vapcguy

32

นี่คือวิธีที่ฉันแก้ไขมันในโครงการของฉัน

มันทำงานและเมื่อเพื่อนร่วมงานส่งการเปลี่ยนแปลงของฉันฉันได้รับข้อยกเว้น "ไม่สามารถโหลด DLL 'SQLite.Interop.dll'" ได้

การกระจายไฟล์. csproj ของโครงการนี่เป็นรุ่นที่ไม่ทำงาน:

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

และนี่คือสิ่งที่รุ่นการทำงานมี:

<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 (ฯลฯ ) ที่เหมาะสม


<itemgroup> สำหรับ "SQLite.Interop.dll" ไม่มีอยู่ในไฟล์. csproj ของโครงการ ฉันยังคงพยายามเพิ่มโซลูชันของคุณ แต่ไม่ได้ผล :(
ayc

สิ่งนี้จะไม่ทำงานใน VS2012 องค์ประกอบไม่มีอยู่
htm11h

ขอบคุณมาก. ทำงานได้ในปี 2558 กับ
Jevgenij Kononov

29

ดังนั้นหลังจากเพิ่ม NuGet การปรับใช้จะไม่คัดลอก Interops คุณสามารถเพิ่มสิ่งนี้ลงในไฟล์ csproj ของคุณและควรแก้ไขพฤติกรรมที่:

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

หากคุณมองหาแหล่งที่มาของ NuGet สำหรับ SQLite คุณสามารถดูสิ่งเหล่านี้ได้โดยเฉพาะ สิ่งนี้ทำให้ฉันสามารถปรับใช้กับ ASP.Net Core ได้


10
ContentSQLiteInteropFiles คือคำตอบ คำตอบยอดนิยมส่วนใหญ่เป็นการคาดเดา
Corey Alix

6
ใช่ ContentSQLiteInteropFiles คือคำตอบ 1. ควรเป็นคำตอบที่ได้รับการยอมรับ 2. ในทางกลับกันก็ควรได้รับการตรวจสอบว่าเป็นแพคเกจนักเก็ตวิธีการทำงานนี้โดยอัตโนมัติหรืออย่างน้อยเอกสารความต้องการสำหรับการกำหนดค่านี้
gerleim

ควรเป็นคำตอบที่ยอมรับได้ ง่ายสุด ๆ 1. ยกเลิกการโหลดโครงการ 2. เพิ่มข้อมูลข้างต้นใน csproj 3. โหลดโครงการซ้ำ มันง่ายมาก ...
BillRuhl

24

เมื่อคุณอยู่ในสถานะนี้ให้ลองทำการสร้างใหม่ทั้งหมด หากวิธีนี้แก้ไขปัญหาคุณอาจมีปัญหาแบบเดียวกันกับที่ฉันมี

พื้นหลังบางส่วน (ความเข้าใจของฉัน) :

  • SQLite มีแอสเซมบลีที่ได้รับการจัดการ 1 (System.Data.SQLite.dll) และแอสเซมบลีเฉพาะหลายแพลตฟอร์ม (SQLite.Interop.dll) เมื่อติดตั้ง SQLite ด้วย Nuget Nuget จะเพิ่มส่วนประกอบเฉพาะแพลตฟอร์มให้กับโครงการของคุณ (ภายในหลายโฟลเดอร์: \ x86, \ x64) และกำหนดค่า dll เหล่านี้เป็น "Copy Always"

  • เมื่อโหลดแล้วแอสเซมบลีที่ได้รับการจัดการจะค้นหาแอสเซมบลีที่ระบุแพลตฟอร์มภายในโฟลเดอร์ \ x86 และ \ x64 คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับที่นี่ ข้อยกเว้นคือแอสเซมบลีที่มีการจัดการนี้พยายามค้นหาที่เกี่ยวข้อง (SQLite.Interop.dll) ภายในโฟลเดอร์เหล่านี้ (และล้มเหลว)

สถานการณ์ของฉัน :

ฉันมี 2 โครงการในโซลูชันของฉัน แอป WPF และไลบรารีคลาส แอป WPF อ้างอิงไลบรารีคลาสและไลบรารีคลาสอ้างอิง SQLite (ติดตั้งผ่าน Nuget)

ปัญหาสำหรับฉันคือเมื่อฉันแก้ไขแอพ WPF เท่านั้น VS พยายามที่จะสร้างใหม่บางส่วน (โดยตระหนักว่า dll ที่พึ่งพาไม่ได้เปลี่ยนแปลง) ที่ไหนสักแห่งในกระบวนการนี้ VS จะล้างเนื้อหาของโฟลเดอร์ \ x86 และ \ x64 (พัดไป SQLite.Interop.dll) เมื่อฉันสร้าง Rebuild-All แบบเต็ม VS จะคัดลอกโฟลเดอร์และเนื้อหาของมันอย่างถูกต้อง

โซลูชันของฉัน :

ในการแก้ไขปัญหานี้ฉันสิ้นสุดกระบวนการเพิ่มโพสต์บิลด์โดยใช้ xcopy เพื่อบังคับให้คัดลอกโฟลเดอร์ \ x86 และ \ x64 จากไลบรารีคลาสไปยังไดเรกทอรี WPF โครงการ \ bin ของฉัน

หรือคุณสามารถทำสิ่งต่าง ๆ ได้ดีขึ้นด้วยการสร้างไดเรกทอรีการกำหนดค่า / ผลลัพธ์ไดเรกทอรี


1
ข้อความที่ฉันได้บอกฉันว่าไฟล์เหล่านั้นหายไป แต่ฉันคิดว่ามันเป็นปัญหาสิทธิ์ เมื่อฉันเห็นข้อความของคุณฉันรู้ว่าพวกเขาไม่เคยทำมันไปยังเซิร์ฟเวอร์เมื่อฉันปรับใช้
Stradas

1
โซลูชันที่ใกล้เคียงกันของฉันคือการเพิ่ม x86 และ x64 โฟลเดอร์ในโครงการเริ่มต้นของฉันจากนั้นเพิ่ม x86 interop และ x64 interop ไฟล์ภายในโฟลเดอร์ที่เกี่ยวข้อง ฉันตั้งค่าตัวเลือกไฟล์เป็น "เนื้อหา" และ "สร้างเสมอ" นี่เป็นวิธีเดียวที่ฉันจะทำให้แอพ Windows Forms เชื่อมต่อกับไฟล์ฐานข้อมูล s3db ในตัวเมื่อฉันปรับใช้แอพด้วย ClickOnce ไปยังพีซีเครื่องอื่น เฉื่อยชาฉันไม่ได้มีข้อผิดพลาด SQLite เมื่อฉันพัฒนาและทดสอบแอพบนพีซีของฉัน
David Alan Condit

ยังคงเกิดขึ้นกับ VS 2017: '(
wmebane

1
นี่คือคำตอบที่ช่วยให้ฉันเข้าใจปัญหาของฉันแม้ว่าการแก้ไขของฉันจะแตกต่างกันเล็กน้อย ปัญหาของฉันคือฉันเพิ่ม system.data.Sqlite.dll ด้วยตนเอง ด้วยวิธีนี้ Sqlite.Interop.dll จะไม่ถูกคัดลอกไปยัง \ x86 และ x64 โดยอัตโนมัติ การแก้ไขคือการลบการอ้างอิงและเพิ่มโดย Nuget
Susan Wang

19

ฉันมีปัญหาเดียวกันกับที่เรียกใช้ Visual Studio Express 2013 ฉันลองวิธีแก้ปัญหาต่าง ๆ ที่กล่าวถึงที่นี่และที่อื่น ๆ เพื่อประโยชน์ ฉันหวังว่าการแก้ไขนี้จะช่วยผู้อื่น

ฉันแก้ไขได้โดยใช้DeploymentItemคุณลักษณะในคลาสทดสอบของฉันที่ทดสอบบริการบน SQLite

ตัวอย่าง:

[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ในการคัดลอกไปยังx86ไดเรกทอรีภายในโฟลเดอร์ "TestResults" ที่เหมาะสม

ทั้งหมดเป็นสีเขียว ทั้งหมดเป็นสิ่งที่ดี.


1
วิธีนี้ใช้ได้เฉพาะเมื่อคุณใช้ Microsoft.VisualStudio.TestTools.UnitTesting namespace เท่านั้น
sapbucket

4
นี่เป็นวิธีแก้ไขที่ถูกต้องหากคุณใช้ MSTest SQLite ทำงานได้ดีค้นหา SQLite.Interop.dll โดยไม่มีปัญหาจนกว่าฉันจะใช้ DeploymentItem ("some.csv") สำหรับการทดสอบ การรวมไฟล์. csv ด้วยวิธีดังกล่าวจะทำให้ MSTest คัดลอก DLLs ที่อ้างอิงทั้งหมดไปยังไดเรกทอรี TestResults เนื่องจาก SQLite.Interop.dll ไม่มีการอ้างอิงในโครงการ (และไม่สามารถเป็นเพราะมันเป็นรหัสที่ไม่มีการจัดการ) จึงไม่มีการคัดลอก
โยฮันน์

ทางออกที่ดีที่สุดของคุณคือการเพิ่มสองบรรทัดหนึ่งสำหรับแต่ละสถาปัตยกรรม สิ่งนี้จะช่วยปกป้องคุณในกรณีที่มีผู้ทดสอบใช้ 64- บิต
Kirk Woll

13

การอัพเดต NuGet จากTools -> Extension and updatesและติดตั้ง SQLite.Core อีกครั้งด้วยคำสั่งPM> Update-Package -reinstall System.Data.SQLite.Coreแก้ไขให้ฉัน


หากคุณได้รับข้อผิดพลาดเมื่อทำเช่นนี้ให้ลบการอ้างอิง / การอ้างอิง SQLite ของฉันออกมาอย่างสมบูรณ์และทำการติดตั้งใหม่ทั้งหมดจาก nuget
KayakinKoder

ติดตั้ง sqllite core ช่วยฉันด้วย เกิดขึ้นที่ VS2012 VS ไม่รวมแพ็คเกจ x62 สำหรับการปรับใช้เว็บ
Andrey R

แก้ไขสำหรับฉันด้วยใน VS2015 Professional
Rahul Kishore

9

ฉันมีปัญหาที่คล้ายกันในโซลูชันหลายโครงการ SQLite.Interop.dll เป็นสิ่งจำเป็นสำหรับหนึ่งในปลั๊กอินที่แจกจ่ายกับซอฟต์แวร์โดยใช้ ClickOnce

เท่าที่การดีบั๊กใน visual Studio ทุกอย่างทำงานได้ดี แต่รุ่นที่ใช้งานหายไปโฟลเดอร์ x86 / และ x64 / บรรจุ DLL นั้น

โซลูชันที่จะให้มันทำงานหลังจากการปรับใช้โดยใช้ ClickOnce คือการสร้างในโครงการเริ่มต้นของการแก้ปัญหา (เช่นเดียวกับที่ถูกเผยแพร่) โฟลเดอร์ย่อยทั้งสองนี้คัดลอก DLLs และกำหนดให้เป็น Content Copy Always

วิธีนี้เครื่องมือการเผยแพร่ ClickOnce จะรวมไฟล์และโฟลเดอร์เหล่านี้โดยอัตโนมัติในไฟล์ Manifest และปรับใช้ซอฟต์แวร์ด้วย


1
นี่เป็นทางออกเดียวที่เหมาะกับฉัน ... และเด็กชาย .. มันเป็นความเจ็บปวดที่จะดีบั๊กเมื่อแอปของคุณเพิ่งปิดบนพีซีของผู้ใช้
อดทน

8

จริงๆมีเป็นจำนวนมากของคำตอบที่นี่ แต่ฉันเป็นที่เรียบง่ายและชัดเจนกับไม่มี GAC เล่นรอบ

ปัญหาคือไฟล์ที่ปฏิบัติการได้ต้องการสำเนาของสิทธิSQLite.Interop.dll(x86 หรือ x64) เพื่อเข้าถึงฐานข้อมูลของเรา

สถาปัตยกรรมส่วนใหญ่มีชั้นและในกรณีของฉันชั้นข้อมูลมี DLL ที่จำเป็นสำหรับการเชื่อมต่อ SQLite

ดังนั้นฉันจึงใส่สคริปต์ build post ลงในData Layer Solution ของฉันและทุกอย่างทำงานได้ดี


TL; DR;

  1. ตั้งค่าโปรเจ็กต์ทั้งหมดของโซลูชันของคุณเป็นx86หรือx64ในตัวเลือกบิลด์

  2. เพิ่มPost-Build-Scriptโครงการต่อไปนี้ด้วยSQLite nuget Package:

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

แน่นอนคุณต้องเปลี่ยนสคริปต์Release Buildและx86สร้าง


STL; DR;

ใส่SQLite.Interop.dllถัดจาก*.exeไฟล์ของคุณ


6

การติดตั้งเริ่มต้นของ SQLite แบบหลายสถาปัตยกรรม (x86, x64) จาก NuGet จะแสดงพฤติกรรมที่คุณอธิบายไว้ หากคุณต้องการโหลดเวอร์ชันที่ถูกต้องสำหรับสถาปัตยกรรมจริงที่. NET runtime เลือกที่จะรันแอปพลิเคชันของคุณบนเครื่องของคุณคุณสามารถให้ DLL loader เป็นคำแนะนำเกี่ยวกับตำแหน่งที่จะค้นหาไลบรารีที่ถูกต้องดังนี้

เพิ่มการประกาศสำหรับการเรียกใช้ฟังก์ชัน kernel32.dll ไปยัง SetDLLDirectory () ก่อน Program.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);

จากนั้นใช้วิธีการของคุณเองในการกำหนดไดเรกทอรีย่อยที่ถูกต้องเพื่อค้นหา '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));

4

แม้ว่าจะเป็นโพสต์เก่าฉันต้องการแบ่งปันวิธีแก้ปัญหาที่ฉันพบที่นี่: http://system.data.sqlite.org/index.html/info/54e52d4c6f

หากคุณไม่ต้องการอ่านปัญหาทั้งหมดวิธีแก้ไขคือการคัดลอกไฟล์ "msvcr100.dll" (ที่สามารถพบได้ในไดเรกทอรี Windows \ System32) ในเส้นทางเดียวกันกับ SQLite.Interop.dll

ฉันแนะนำให้อ่านปัญหาเพื่อทำความเข้าใจสาเหตุและเพื่อรวมไฟล์ไว้ในการตั้งค่าของคุณ แต่เพื่อติดตั้งเฉพาะเมื่อเกิดข้อผิดพลาดฉันทำให้มันเป็นส่วนประกอบเพิ่มเติมที่เลือกได้ในตัวเลือกการตั้งค่า

HTH, Formentz


ขอบคุณมากสำหรับสิ่งนี้ฉันลองทุกอย่างและนี่คือทางออก
David Benko

4

ตามที่SQLite wikiกล่าวว่าการปรับใช้แอปพลิเคชันของคุณจะต้อง:

การปรับใช้แอปพลิเคชัน

ดังนั้นคุณต้องปฏิบัติตามกฎ ค้นหา dll ที่ตรงกับแพลตฟอร์มเป้าหมายของคุณและวางไว้ในตำแหน่งอธิบายในรูปภาพ ที่อยู่สามารถพบได้ใน YourSolution / packages / System.Data.SQLite.Core.% version% /

ฉันมีปัญหากับการปรับใช้แอปพลิเคชันดังนั้นฉันเพิ่งเพิ่ม SQLite.Interop.dll ที่ถูกต้องลงในโครงการของฉันโฟลเดอร์ x86 ที่เพิ่มเข้ากับ AppplicationFolder ในโครงการติดตั้งและเพิ่มการอ้างอิงไฟล์ไปยัง dll


3

คุณอาจได้รับข้อผิดพลาดนี้หากคุณพยายามเรียกใช้ dll 32 บิตในโครงการ 64 บิต

ฉันได้สิ่งนี้เมื่อฉันวางไฟล์เดียวกัน (SQLite.Interop.dll ในรุ่น 32 บิต) ทั้งในโฟลเดอร์ x86 และ x64



3

ฉันยังไม่รู้ว่าทำไมถึงยังไม่ถูกรวมเข้าด้วยกัน แต่ฉันต้องทำการวิจัยและค้นหาสิ่งนี้ด้วยตัวเองดังนั้นหวังว่าบางคนจะพบคำตอบนี้และช่วยให้รอดพ้น สิ่งนี้มีไว้สำหรับแอป WPF มันทำงานได้ดีในกล่อง Dev ของฉัน แต่ไม่ได้ทำงานบนคอมพิวเตอร์ที่ฉันกำลังคัดลอกและได้รับUnable to load DLL 'SQLite.Interop.dll'ข้อผิดพลาด ฉันย้ายไปยังไดเรกทอรีและไฟล์ที่เกี่ยวข้องทั้งหมดโดยตรงจากโฟลเดอร์ "Debug" ไปยังคอมพิวเตอร์เครื่องอื่นนี้เมื่อฉันได้รับข้อผิดพลาดเดียวกับ OP เมื่อฉันเรียกใช้ โฟลเดอร์ "bin" ของฉันที่มี DLLs ของฉันถูกคัดลอกไปยัง "Debug \ bin" และทั้งหมดรวมอยู่ในนั้นพร้อมกับไฟล์แอปพลิเคชันของฉันเมื่อฉันคัดลอกไปยังคอมพิวเตอร์เครื่องอื่นโดยใช้พา ธ นี้

สิ่งที่ฉันเห็นพูดในคำตอบอื่น ๆ ที่ไม่ได้ใช้:

  • ฉันไม่ได้ใช้แพ็คเกจ NuGet หรือต้องการสร้างโฟลเดอร์ x86 หรือ x64 ที่ดูเหมือนว่าแพ็กเกจ NuGet สร้างขึ้น DLLs ของฉัน (System.Data.SQLite และ SQLite.Interop.dll พร้อมกับ System.Data.SQLite.config) อยู่ในโฟลเดอร์ "bin" ในโครงการของฉันและถูกคัดลอกด้วยตนเอง (สร้าง "bin" ใน Explorer โซลูชันใน VS วาง DLLs ลงในโฟลเดอร์นี้ใน Windows Explorer ใช้เพิ่ม> รายการที่มีอยู่เพื่อนำไฟล์เข้าสู่โฟลเดอร์ / โครงการ VS) จากนั้นฉันอ้างอิงพวกเขาเป็นแอสเซมบลีอ้างอิงในโครงการของฉันโดยใช้ตำแหน่งนั้น ("การอ้างอิง"> "เพิ่มการอ้างอิง" และเรียกดูหนึ่งล้างทำซ้ำสำหรับส่วนที่เหลือ) สิ่งนี้ทำให้มั่นใจได้ว่าโครงการของฉันจะรู้ว่าพวกเขาอยู่ที่ไหน
  • ฉันไม่จำเป็นต้องอ้างอิงไฟล์ SQLite DLL ใด ๆ ใน app.config หรือแม้แต่แตะที่ไฟล์ MyProject.csproj ของฉัน
  • ฉันไม่จำเป็นต้องระบุโปรเซสเซอร์โดยเฉพาะ! โครงสร้างของโครงการของฉันมีไว้สำหรับ "ใด ๆ CPU" แม้ว่าฉันจะมีเพียง DLLs แบบผสมหรือ 64 บิตและจะทำงานบน Windows 7+ เท่านั้นซึ่งเป็นระบบปฏิบัติการ 64 บิต (ไม่มี DLLs x86 เพียงอย่างเดียว / 32 บิตเท่านั้น)
  • ฉันระบุพวกเขาเป็น "เนื้อหา" และ "คัดลอกถ้าใหม่กว่า" สำหรับ DLL เหล่านี้เมื่อฉันพบข้อผิดพลาดของ OP

สิ่งที่ฉันพบคือสิ่งนี้จากhttps://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :

(11) ทำไมฉันถึงได้รับ DllNotFoundException (สำหรับ "sqlite3.dll" หรือ "SQLite.Interop.dll") เมื่อพยายามเรียกใช้แอปพลิเคชันของฉัน

ไม่สามารถระบุตำแหน่งไลบรารีการเชื่อมโยงแบบไดนามิก (DLL) ที่มีชื่อหรือไม่สามารถโหลดได้เนื่องจากการอ้างอิงที่ขาดหายไป ตรวจสอบให้แน่ใจว่าไลบรารีการเชื่อมโยงแบบไดนามิกที่มีชื่ออยู่ในไดเรกทอรีแอปพลิเคชันหรือไดเรกทอรีตามเส้นทางของระบบและลองอีกครั้ง นอกจากนี้ตรวจสอบให้แน่ใจว่ามีการติดตั้งรันไทม์แจกจ่ายซ้ำของ Visual C ++ ที่จำเป็นเว้นแต่ว่าคุณกำลังใช้ไลบรารีลิงก์แบบไดนามิกที่สร้างขึ้นแบบสลิงค์แบบคงที่

เน้นการทำเหมืองในส่วนที่เป็นตัวหนาในย่อหน้า คอมพิวเตอร์เป้าหมายนั้นใหม่และไม่มีโหลดโปรแกรมยกเว้น. NET 4.0 เมื่อฉันติดตั้ง C ++ มันก็สามารถทำคำสั่งให้กับ SQLite ได้ นี่ควรเป็นหนึ่งในคำถามที่พบบ่อยครั้งแรกและเป็นส่วนหนึ่งของข้อกำหนดเบื้องต้น แต่ถูกฝังที่ # 11 คอมพิวเตอร์สำหรับการพัฒนาของฉันโหลดมาแล้วเพราะมาพร้อมกับ Visual Studio ดังนั้นนั่นจึงเป็นเหตุผลที่ทำงานได้

ดาวน์โหลด:
Visual C ++ Redistributable สำหรับ Visual Studio 2015:
https://www.microsoft.com/en-us/download/details.aspx?id=48145

อัปเดต 3 (อัปเดตสะสม):
https://www.microsoft.com/en-us/download/details.aspx?id=53587


3

ฉันเริ่มใช้ Costura.Fody to ชุดประกอบ (.net) และฝังและโหลด dll พื้นเมือง นอกจากนี้ยังช่วยในภายหลังด้วยการแจกจ่ายที่คุณสามารถส่งไฟล์ได้หนึ่งไฟล์

  1. ติดตั้ง Costura Fody จาก Nuget

  2. ในโครงการ C # ของคุณสร้างโฟลเดอร์ชื่อ costrua32 ในนั้นมี dll ท้องถิ่นใด ๆ ที่คุณโหลด C #

  3. เมื่อคุณเพิ่มลงในโฟลเดอร์นี้แล้ว คลิกที่หน้าต่างคุณสมบัติและเปลี่ยนการดำเนินการสร้างเป็น "ทรัพยากรฝังตัว"

  4. ในที่สุดคุณต้องแก้ไขไฟล์ XML ชื่อ FodyWeavers.xml ดังนี้ ที่นี่ฉันกำลังระบุโหลด sql dll ก่อน (โปรดทราบว่าคุณวาง. dll)

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

ข้อดีของการทำเช่นนี้คือคุณไม่จำเป็นต้องเขียนกิจกรรมก่อนหรือหลังการสร้างและผลิตภัณฑ์สุดท้ายจะถูกห่อหุ้มทั้งหมดไว้ในไฟล์ขนาดใหญ่กว่าหนึ่งไฟล์


ชื่อโฟลเดอร์ควรเป็น costura32, เอกสารgithub.com/Fody/Costura#native-l
Elton Saunders


2

ฉันมีปัญหานี้เพราะ Visual C ++ 2010 ไม่สามารถเผยแพร่ซ้ำได้ติดตั้งในพีซีของฉันหากคุณยังไม่ได้ติดตั้ง Visual C ++ 2010 สามารถเผยแพร่ต่อได้ดาวน์โหลดและติดตั้ง (ตรวจสอบ x86 หรือ 64 dll)


ใช่. นี่คือกรณีของฉันเช่นกัน ... เฉพาะของฉันเท่านั้นที่ต้องการ Visual C ++ 2010 ที่เผยแพร่ซ้ำได้ SP1 จิตวิญญาณที่ดีที่สุดคือการอ่านอย่างรอบคอบซึ่งเป็นสิ่งจำเป็นสำหรับรุ่นของคุณ ตัวอย่างเช่นที่นี่: system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Velja Radenkovic

ลิงค์ล่าสุด: support.microsoft.com/en-us/help/2977003/…
didge

2

ฉันมีปัญหาเดียวกัน อย่างไรก็ตามในที่สุดฉันสามารถแก้ไขได้ ปัจจุบันฉันใช้ Visual Studio 2013 Community Edition ฉันเพิ่งใช้Add-> Item ที่มีอยู่ ...และเรียกดูตำแหน่งที่ไฟล์ SQLite.Data.SQLite อยู่ใน (กรณีของฉันคือ 'C: \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin') โปรดอย่าลืมที่จะเปลี่ยนแปลงชนิดของสิ่งที่คุณจะรวมถึงการไฟล์สมัชชา (* .dll * .pdb) เลือก ' SQLite.Interop.dll ' ในโฟลเดอร์นั้น จากนั้นฉันสามารถดำเนินการต่อได้โดยไม่มีปัญหาใด ๆ เลย ขอให้โชคดีทุกท่าน ^ _ ^ PS ฉันสร้างแอปพลิเคชันเว็บฟอร์ม ฉันยังไม่ได้ลองในแอปพลิเคชันแบบฟอร์มหน้าต่างหรือรายการอื่น ๆ


2

ลองตั้งค่าเป้าหมายแพลตฟอร์มเป็น x86 หรือ x64 (และไม่ใช่ CPU ใด ๆ ) ก่อนที่คุณจะสร้าง: โครงการ -> คุณสมบัติ -> สร้าง -> เป้าหมายแพลตฟอร์มใน Visual Studio


2

คัดลอก 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

ฉันต้องให้ IIS_APPPOOL แก้ไขการอนุญาตไปยังไฟล์ Bin เพื่อแก้ปัญหา เพียงแค่คัดลอก ddl เป็นสาเหตุให้ Access Denied เป็น dll
AlexanderD

การเพิ่มไฟล์เหล่านี้แก้ปัญหาได้แล้ว แต่นี่เป็นวิธีแก้ปัญหาชั่วคราว
Kartik Goyal

2

ฉันดิ้นรนกับสิ่งนี้เป็นเวลานานและบางครั้งฉันพบว่าการตั้งค่าการทดสอบไม่ถูกต้อง ดูภาพนี้: ทดสอบการตั้งค่า

ฉันเพียงยกเลิกการตั้งค่าการทดสอบและปัญหาจะหายไป มิฉะนั้นจะเกิดข้อยกเว้นขึ้น หวังว่านี่จะช่วยใครซักคน ไม่แน่ใจว่าเป็นต้นเหตุ


1
ในขณะที่ลิงค์นี้อาจตอบคำถามได้ดีกว่าที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง คำตอบสำหรับลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง - จากรีวิว
Robert Columbia

ในกรณีของฉันไฟล์ชุดทดสอบไม่ถูกต้อง: <TestSettings ... <Deployment> <DeploymentItem filename = "bin \ Relase \ a.test.dll" การกำหนดค่าตำแหน่งไฟล์ไม่ถูกต้อง
Tony Sun

2

คัดลอกไฟล์ "SQLite.Interop.dll" สำหรับทั้ง x86 และ x64 ในโฟลเดอร์ดีบั๊ก ไฟล์เหล่านี้ควรคัดลอกลงใน "x86" และ "x64 โฟลเดอร์ในโฟลเดอร์ดีบั๊ก


2

ใบสมัครของฉันเป็นโปรแกรมเว็บ (ASP.NET MVC) และฉันต้องเปลี่ยนสระว่ายน้ำประยุกต์ใช้ในการทำงานภายใต้แทนLocalSystem ApplicationPoolIdentityเพื่อทำสิ่งนี้:

  1. เปิดตัวจัดการ IIS
  2. ค้นหา Application Pool ที่ไซต์ของคุณกำลังทำงานอยู่
  3. คลิกการตั้งค่าขั้นสูงจากการกระทำ
  4. เปลี่ยนข้อมูลประจำตัวเป็น LocalSystem

ฉันไม่รู้ว่าทำไมสิ่งนี้จึงแก้ไขปัญหาได้


1

ฉันไม่รู้ว่ามันเป็นคำตอบที่ดีหรือไม่ แต่ฉันสามารถแก้ปัญหานี้ได้ด้วยการเรียกใช้แอปพลิเคชันของฉันภายใต้ AppDomain ด้วยรหัสประจำตัวของ "Local System"


1

ฉันกำลังทำงานกับแอปพลิเคชั่นคอนโซลอย่างง่ายเพื่อเพิ่มข้อมูลทดสอบลงในฐานข้อมูล SQLite และได้รับข้อผิดพลาดนี้ การกำหนดค่าสำหรับโครงการคือ "Any CPU" ฉันแก้ไขได้โดยการคัดลอก SQLite.Interop.dll ไปยังโฟลเดอร์ bin \ debug วิธีที่ดีกว่าคือการใช้วิธีการโดย @Wil แต่คุณจะระบุสิ่งนี้สำหรับการกำหนดค่า "CPU ใด ๆ " ได้อย่างไร


1

มีการโต้เถียงกันในการประชุมหรือไม่? ตรวจสอบดูว่ามีแอปพลิเคชันอื่นที่มีไฟล์ล็อคอยู่ใน DLL

หากนี่คือเหตุผลควรใช้เครื่องมืออย่างเช่นProcess Explorer ของ Sysinternalเพื่อค้นหาโปรแกรมที่ละเมิด

HTH ดิน


1

สำหรับการอ้างอิงสำหรับทุกคนที่ดูคำถามนี้:

หากคุณใช้แพ็กเกจ nuget มันจะติดตั้งกฎการสร้างที่ทำสำเนาให้คุณ (ดูภายใต้ System.Data.SQLite.Core.1.0.94.0 \ build - หรือ Core รุ่นใดก็ตามที่คุณติดตั้ง)

ตัวติดตั้ง nuget จะเพิ่มกฎลงในไฟล์โครงการของคุณโดยอัตโนมัติ

นี่ยังไม่สามารถแก้ปัญหากรณีทดสอบได้ DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) วิธีการเป็นสิ่งเดียวที่ดูเหมือนว่าจะทำงานที่นั่น


1

ฉันพบปัญหานี้ในวิธีแก้ปัญหาด้วยโครงการเว็บ WebAPI / MVC5 และโครงการทดสอบคุณสมบัติที่ทั้งคู่ดึงออกจากโครงการเข้าถึงข้อมูล (หรือ 'Core') เดียวกัน ฉันชอบคนอื่น ๆ มากมายที่นี่ฉันใช้สำเนาที่ดาวน์โหลดผ่าน NuGet ใน Visual Studio 2013

สิ่งที่ฉันทำคือใน Visual Studio เพิ่มโฟลเดอร์โซลูชัน x86 และ x64 ในการทดสอบคุณสมบัติและโครงการเว็บ ฉันทำแล้วRight Click | Add Existing Item...และเพิ่มไลบรารี SQLite.interop.dll ที่เหมาะสมจาก..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]สำหรับแต่ละโฟลเดอร์เหล่านั้น จากนั้นผมก็ไม่ได้Right Click | Propertiesและชุดที่จะCopy to Output Directory Always Copyครั้งต่อไปที่ฉันต้องการเรียกใช้การทดสอบคุณสมบัติการทดสอบทำงานได้สำเร็จ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.