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 का उपयोग कर रहा हूं। संस्करण, इसे VS2010, OS Win7 64 में नगेट के साथ स्थापित करना।

एक बार अपवाद दिखाई देने लगे तो यह लगातार दिखाई देता है - डिबग और रिलीज़ और रनिंग एप्लिकेशन में वी.एस.

इसे रोकने का एकमात्र तरीका लॉगऑफ़ और लॉगऑन है। अपवाद नहीं फेंका गया है और dll लोड किया गया है। यह दिनों के लिए काम कर सकता है, लेकिन फिर यह फिर से टूट सकता है।

क्या किसी ने ऐसा कुछ देखा है और क्या इसका कोई हल है?


2
हां, यह हमेशा कॉपी करने के लिए सेट है। मेरे पास x64 और x86 फ़ोल्डर बिन / डीबग में हैं। और यह ज्यादातर काम करता है, लेकिन कभी-कभी काम करना बंद कर देता है। संभवतया कुछ डीएल तक पहुंच को रोक रहा है, मैं अगली बार यह पता लगाने की कोशिश करूंगा कि यह काम करना बंद कर देता है। जैसा कि मैंने कहा कि यह बिना किसी समस्या के काम कर सकता है।
xll

13
SQLite नगेट पैकेज को एक नए कंसोल प्रोजेक्ट में जोड़ने के बाद मुझे यह त्रुटि सही लगी। मैन्युअल रूप से एक स्तर तक x86 फ़ोल्डर से SQLite.Interop.dll की प्रतिलिपि बनाने से एप्लिकेशन को चलाने की अनुमति मिलती है। मेरे लिए अजीब लगता है कि यह इतना टूट जाएगा।
शोर्ट

@Wayne हाँ, यह निश्चित रूप से मदद करता है। लेकिन मेरे मामले में, हम प्रोजेक्ट पर एक साथ काम कर रहे हैं, और मेरे दोस्त x86 का उपयोग कर रहे हैं, जबकि मैं x64 ओएस। और जैसा कि मैंने देखा, यह कभी-कभी काम करना बंद कर देता है। हालांकि यह पिछले महीने मेरे साथ नहीं हुआ।
xll

1
यदि आप SQLite के लिए सही बाइनरी डाउनलोड करते हैं तो अपने प्रोजेक्ट बिल्ड विकल्प के अनुसार SQLite.Interop.dll को अपने रिलीज़ या डीबग फ़ोल्डर में कॉपी करें।
एलशान

यह इस तरह के एक यादृच्छिक बग है ... कभी-कभी यह होता है और कभी-कभी यह मेरी परियोजना के लिए नहीं होता है। सब कुछ करने की कोशिश की।
बीके

जवाबों:


140

मुझे पता है कि मुझे पार्टी में देरी हो रही है, लेकिन मेरे पास नवीनतम x86 / x64 आज (संस्करण 1.0.88.0) नीचे खींचने के बाद यह मुद्दा था। VS2012 में मेरा स्थानीय IIS डिफ़ॉल्ट रूप से 32 बिट चलाता है और x64 पर स्विच करने का कोई आसान तरीका नहीं है। मेरा उत्पादन सर्वर 64 बिट चलाता है।

वैसे भी मैंने NuLet पैकेज को DLL प्रोजेक्ट में स्थापित किया है और मुझे यह त्रुटि मिली है। मुझे इसे काम करने के लिए क्या करना था मुझे इसे मुख्य साइट पर स्थापित करना था परियोजना में भी । यहां तक ​​कि अगर यह बिल्कुल SQLite वर्गों को नहीं छूता है।

मेरा अनुमान है कि SQLite इंटरॉप असेंबली का उपयोग करता है ताकि यह पता लगाया जा सके कि इंटरॉप का कौन सा संस्करण लोड करना है।


11
मैंने मुख्य परियोजना में NuGet के साथ SQLite कोर के संदर्भ को जोड़ने के बाद यह मेरे लिए काम किया।
लुका क्रेमोनी

मुख्य परियोजना में sqllite.core जोड़ना मेरे WPF समाधान पर मेरे लिए काम किया
दीपू राज

मुझे इनस्टॉल-पैकेज Sqlite के साथ-साथ Install-Package System.Data.SQLite.Core दोनों को अपनी वेबसाइट में करना था, भले ही db कॉल्स एक लाइब्रेरी में हों ...

इसका उत्तर होना चाहिए।
बॉबी तुर्कलिनो

4
"मुख्य साइट" परियोजना से आपका क्या मतलब है? मेरे मामले में मैं डेस्कटॉप काम कर रहा हूं। क्या आपका मतलब "स्टार्टअप" प्रोजेक्ट है?
उउदद्ल्र्र्र्स

60

मुझे यह समस्या थी क्योंकि एक dll मैं उपयोग कर रहा था एक निर्भरता के रूप में Sqlite था (केवल Sqlite कोर पैकेज के साथ NuGet में कॉन्फ़िगर किया गया था।)। प्रोजेक्ट 'SQLite.Interop.dll' (x86 और x64 फ़ोल्डर) को छोड़कर सभी Sqlite dll-s को संकलित और कॉपी करता है।

समाधान बहुत सरल था: जिस परियोजना का आप निर्माण कर रहे हैं / चल रहे हैं और dll-s की प्रतिलिपि बनाई जाएगी, उस पर निर्भरता के रूप में Sqlite.Core पैकेज को जोड़ें।


मेरे लिए काम किया! धन्यवाद
ट्रिस्टन Djahel

माना। मैं 'Sqlite.Net PCL' पैकेज का उपयोग कर रहा हूं, लेकिन मुझे 'System.Data.SQLite Core (x86 / x64)' की भी आवश्यकता है। मुझे 'किसी भी सीपीयू' के बजाय 'x86' या 'x64' के प्लेटफ़ॉर्म लक्ष्य का उपयोग करने के लिए इसे संदर्भित करने वाली परियोजना को बदलना पड़ा।
एंड्रयू स्टीफेंस

2
यहां पोस्ट किए गए कुछ समाधानों की कोशिश की, यह वास्तव में सबसे अच्छा काम किया।
बैटमैन

2
आप इस तरह एक निर्भरता कैसे जोड़ सकते हैं? कभी नहीं किया (VS2013)
jpgrassi

3
टूल पर जाएं -> NuGet Package Manager -> समाधान के लिए NuGet पैकेज प्रबंधित करें ... -> ऑनलाइन -> सभी। फिर sqlite खोजें और System.Data.SQLite Core (x86 / x64) जोड़ें।
मारिन

44

WPF प्रोजेक्ट में SQLite का उपयोग करते समय मुझे यही समस्या थी जिसका प्लेटफॉर्म लक्ष्य था Any CPU। मैंने इसे निम्न चरणों का पालन करके तय किया:

  1. Visual Studio में प्रोजेक्ट डिज़ाइनर खोलें। इसे कैसे करना पर विवरण पाया जा सकता है यहां
  2. बिल्ड टैब पर क्लिक करें।
  3. prefer 32-bitविकल्प को अक्षम करें ।

वैकल्पिक रूप से, आप केवल प्लेटफ़ॉर्म लक्ष्य को x86या पर सेट कर सकते हैं x64। मुझे लगता है कि इस समस्या के कारण होता हैSystem.Data.SQLite 'SQLite.Interop.dll' फ़ाइल का स्थान पाने के लिए प्लेटफ़ॉर्म लक्ष्य का उपयोग करके लाइब्रेरी के ।

अपडेट करें:

यदि प्रोजेक्ट डिज़ाइनर तक नहीं पहुँचा जा सकता है, तो बस *.csprojटेक्स्ट एडिटर से प्रोजेक्ट ( ) फ़ाइल खोलें और टैग <Prefer32Bit>false</Prefer32Bit>में वैल्यू जोड़ें <PropertyGroup>...</PropertyGroup>

उदाहरण कोड

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

मैं वीएस 2010 का उपयोग कर रहा हूं, ऐसा कोई विकल्प नहीं है।
xll

@xll, मैंने स्पष्टीकरण के लिए उत्तर संपादित किया। जांचें कि क्या चीजें साफ करती हैं।
कालेब कीज

10
VS2012 में यह विकल्प मेरे लिए धूसर हो गया है।
कुगेल

6
विकल्प केवल ईएक्सई परियोजनाओं पर सक्षम है, लेकिन मुझे लगता है कि हम में से अधिकांश के पास इकाई परीक्षण परियोजनाओं के साथ यह मुद्दा है।
Brannon

1
वीएस प्रो 2015 में एक WPF परियोजना में मेरे लिए .csprojतैयार किया गया था । फ़ाइल falseपहले से ही सेट थी , लेकिन फिर भी त्रुटि थी।
vapcguy

32

इसे मैंने अपने प्रोजेक्ट में तय किया है।

यह काम कर रहा था, और जब एक सहयोगी ने अपने परिवर्तन प्रस्तुत किए, तो मुझे "DLL 'SQLite.Interop.dll' अपवाद को लोड करने में असमर्थ मिला।

प्रोजेक्ट की .csproj फ़ाइल में कठिनाई, यह NON-WORKING संस्करण में था:

<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 फ़ाइलों को उपयुक्त डीबग \ x64 (आदि) फ़ोल्डर में डंप किया गया था।


"SQLite.Interop.dll" के लिए <itemgroup> प्रोजेक्ट .csproj फ़ाइल में नहीं है। अभी भी मैं अपने समाधान जोड़ने की कोशिश की, लेकिन काम नहीं किया :(
AYC

यह VS2012 में काम नहीं करेगा, तत्व मौजूद नहीं हैं।
htm11h

आपका बहुत बहुत धन्यवाद। 2015 बनाम में काम करता है
Jevgenij Kononov

29

इसलिए, NuGet को जोड़ने के बाद परिनियोजन इंटरॉप्स की प्रतिलिपि नहीं बनाता है। आप इसे अपनी csproj फ़ाइल में जोड़ सकते हैं और इसे उस व्यवहार को ठीक करना चाहिए:

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

यदि आप SQLite के लिए NuGet के स्रोत में देखते हैं तो आप देख सकते हैं कि ये विशेष रूप से क्या कर रहे हैं। इसने मुझे ASP.Net कोर के साथ काम करने का मौका दिया।


10
ContentSQLiteInteropFiles जवाब है। अधिकांश शीर्ष उत्तर अनुमानित हैं।
कोरी अलिक्स

6
हां, ContentSQLiteInteropFiles इसका जवाब है। 1. यह स्वीकृत उत्तर होना चाहिए 2. दूसरी ओर, यह जांच की जानी चाहिए, कि एक नगेट पैकेज के रूप में कि यह कार्य कैसे स्वचालित रूप से किया जाता है, या कम से कम इस विन्यास की आवश्यकता का दस्तावेज।
gerleim

स्वीकृत उत्तर होना चाहिए। सुपर सिंपल है। 1. उतराई परियोजना 2. ऊपर csproj में जोड़ें 3. पुनः लोड परियोजना। यह इतना आसान है ...
बिलरुहल

24

जब आप इस स्थिति में आते हैं, तो एक पुनर्निर्माण-सभी प्रदर्शन करने का प्रयास करें। यदि यह समस्या को ठीक करता है, तो आपके पास वही समस्या हो सकती है जो मेरे पास थी।

कुछ पृष्ठभूमि (मेरी समझ) :

  • SQLite में 1 प्रबंधित असेंबली (System.Data.SQLite.dll) और कई प्लेटफ़ॉर्म विशिष्ट असेंबली (SQLite.Interop.dll) हैं। Nuget के साथ SQLite स्थापित करते समय, Nuget आपकी परियोजना के लिए प्लेटफ़ॉर्म विशिष्ट असेंबलीज़ को जोड़ देगा (कई फ़ोल्डरों के भीतर: \ x86, \ x64), और इन dll को "हमेशा कॉपी करें" कॉन्फ़िगर करें।

  • लोड होने पर, प्रबंधित असेंबली \ x86 और \ x64 फ़ोल्डर के अंदर प्लेटफ़ॉर्म विशिष्ट असेंबली के लिए खोज करेगी। आप यहाँ पर अधिक देख सकते हैं । अपवाद यह प्रबंधित असेंबली इन फ़ोल्डरों के अंदर प्रासंगिक (SQLite.Interop.dll) को खोजने का प्रयास कर रही है (और विफल हो रही है)।

मेरा परिदृश्य :

मेरे हल में 2 परियोजनाएँ हैं; एक WPF ऐप, और एक क्लास लाइब्रेरी। WPF ऐप क्लास लाइब्रेरी का संदर्भ देता है, और क्लास लाइब्रेरी संदर्भ SQLite (Nuget द्वारा स्थापित)।

मेरे लिए मुद्दा तब था जब मैं केवल WPF ऐप को संशोधित करता था, वीएस एक आंशिक पुनर्निर्माण करने का प्रयास करता है (यह महसूस करते हुए कि निर्भर डीएल बदल गया है)। इस प्रक्रिया में कहीं, वीएस \ x86 और \ x64 फ़ोल्डरों की सामग्री (SQLite.Interop.dk दूर उड़ा) को साफ करता है। जब मैं एक पूर्ण पुनर्निर्माण-सभी करता हूं, तो वीएस फ़ोल्डर्स और उनकी सामग्री को सही ढंग से कॉपी करता है।

मेरा समाधान :

इसे ठीक करने के लिए, मैंने xcopy का उपयोग करके पोस्ट-बिल्ड प्रक्रिया को जोड़ने के लिए क्लास लाइब्रेरी से अपने WPF प्रोजेक्ट \ बिन निर्देशिका में \ x86 और \ x64 फ़ोल्डर की प्रतिलिपि बनाने के लिए मजबूर किया।

वैकल्पिक रूप से, आप बिल्ड कॉन्फ़िगरेशन / आउटपुट निर्देशिकाओं के साथ कट्टर चीजें कर सकते हैं।


1
मुझे जो संदेश मिला वह मुझे बता रहा था कि वे फाइलें गायब थीं लेकिन मुझे लगा कि यह एक अनुमति मुद्दा था। एक बार जब मैंने आपके संदेश को देखा, तो मुझे एहसास हुआ कि जब मैंने तैनात किया था तब उन्होंने वास्तव में इसे सर्वर पर नहीं बनाया था।
चरणदास

1
मेरे समरूप समाधान के लिए मेरे स्टार्टअप प्रोजेक्ट में x86 और x64 फ़ोल्डरों को जोड़ना था, फिर उनके संबंधित फ़ोल्डरों के भीतर x86 इंटरॉप और x64 इंटरॉप फ़ाइलों को जोड़ना था। मैंने "कंटेंट" और "बिल्ड ऑलवेज" के लिए फाइल का विकल्प सेट किया है। यह एकमात्र तरीका है जब मैं अपने विंडोज फॉर्म ऐप को एक एम्बेडेड s3db डेटाबेस फ़ाइल से कनेक्ट करने के लिए प्राप्त कर सकता था जब मैंने क्लिकऑन के साथ ऐप को अन्य पीसी पर तैनात किया था। निराशा की बात यह है कि जब मैंने अपने पीसी पर ऐप को विकसित और परीक्षण किया, तो मेरे पास एक SQLite त्रुटि नहीं थी।
डेविड एलन कोंडिट

अभी भी वीएस 2017 के साथ हो रहा है: '(
wmebane

1
यह उत्तर है जो मुझे मेरी समस्या को समझने में मदद करता है, हालांकि मेरा फिक्स थोड़ा अलग है। मेरी समस्या यह है कि मैंने मैन्युअल रूप से system.data.Sqlite.dll जोड़ा है। इस तरह Sqlite.Interop.dll स्वचालित रूप से \ x86 और x64 में कॉपी नहीं किया जाता है। फिक्स संदर्भ को हटाने और Nuget द्वारा इसे जोड़ना है।
सुसान वांग

19

मेरे पास विजुअल स्टूडियो एक्सप्रेस 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
    }
}

यह उचित "TestResults" फ़ोल्डर के भीतर निर्देशिका में SQLite.Interop.dllकॉपी होने की आवश्यकता का कारण बनता है x86

सब हरा है। सब अच्छा है।


1
यह समाधान केवल तभी काम करता है जब आप Microsoft.VisualStudio.TestTools.UnitTesting नाम स्थान का उपयोग कर रहे हों
sapbucket

4
यदि आप MSTest का उपयोग कर रहे हैं तो यह एक सही समाधान है। SQLite ने ठीक काम किया, SQLite.Interop.dll को बिना किसी समस्या के ढूँढने, जब तक कि मैंने एक परीक्षण के लिए Dep तैनातीItem ("some.csv") का उपयोग नहीं किया। इस तरह से .csv फ़ाइल को शामिल करके MSTest को ट्रिगर किया गया ताकि सभी संदर्भित dlls को TestResults निर्देशिका पर कॉपी किया जा सके। चूंकि SQLite.Interop.dll परियोजना में संदर्भित नहीं है (और यह अप्रबंधित कोड होने के बाद से नहीं हो सकता है), इसे कभी भी कॉपी नहीं किया गया।
जोहान

आपका सबसे अच्छा दांव दो लाइनों को जोड़ना है, प्रत्येक वास्तुकला के लिए एक। उस स्थिति में आपकी रक्षा करता है जब टेस्ट रनर 64-बिट रनिंग होता है।
कर्क वॉक

13

NuGet को अपडेट करना Tools -> Extension and updatesऔर SQLite को फिर से इंस्टॉल करना। कमांड के साथ PM> Update-Package -reinstall System.Data.SQLite.Coreइसे मेरे लिए तय किया।


यदि ऐसा करते समय आपको कोई त्रुटि मिलती है, तो मेरी SQLite DLL / संदर्भों को हटाकर और उन्हें nuget से पूरी तरह से पुनर्स्थापित करने के लिए इसके लिए चाल चली गई
चली गई KayakinKoder

मुझे भी sqlite कोर मदद पुनर्स्थापित करें। VS2012 में हुआ। VS ने वेब परिनियोजित पैकेज के लिए x62 संस्करण को शामिल नहीं किया
एंड्री आर

VS2015 प्रोफेशनल में भी मेरे लिए निश्चित।
राहुल किशोर

9

कई परियोजनाओं के समाधान में मेरे पास एक समान मुद्दा था। SQLite.Interop.dll सॉफ्टवेयर में ClickOnce के उपयोग से वितरित एक प्लगइन्स के लिए आवश्यक था।

जहां तक ​​विजुअल स्टूडियो में डिबगिंग का काम है, सब कुछ ठीक है, लेकिन तैनात संस्करण x86 / और x64 / DLL युक्त फ़ोल्डर्स को याद कर रहा था।

ClickOnce का उपयोग करके परिनियोजन के बाद इसका काम करने का समाधान इन दो सबफ़ोल्डर के समाधान की स्टार्टअप परियोजना (भी प्रकाशित किया जा रहा है) में बनाना था, उन्हें DLL में कॉपी करें और उन्हें सामग्री की प्रतिलिपि के रूप में हमेशा सेट करें।

इस तरह से ClickOnce प्रकाशन उपकरण स्वचालित रूप से प्रकट में इन फ़ाइलों और फ़ोल्डरों को शामिल करता है और उनके साथ सॉफ़्टवेयर को तैनात करता है


1
यह एकमात्र समाधान था जो मेरे लिए काम करता था ... और लड़का .. क्या यह तब डीबग करने का दर्द था जब आपका ऐप केवल उपयोगकर्ता के पीसी पर बंद हो जाता है।
स्टोइक

8

यहां वास्तव में बहुत सारे उत्तर हैं, लेकिन मेरा कोई जीएसी-प्लेइंग-इर्दगिर्द सरल और स्पष्ट है ।

समस्या यह थी, निष्पादन योग्य फ़ाइल को SQLite.Interop.dllहमारे डेटाबेस तक पहुँचने के लिए दाईं ओर (x86 या x64) की एक प्रति चाहिए ।

ज्यादातर आर्किटेक्चर की परतें होती हैं और मेरे मामले में डेटा लेयर है में SQLite कनेक्शन के लिए आवश्यक DLL होता है।

इसलिए मैंने अपने डेटा लेयर सॉल्यूशन में एक पोस्ट बिल्ड स्क्रिप्ट डाली और सब कुछ ठीक काम कर गया।


टी एल; डॉ;

  1. अपने समाधान की सभी परियोजनाओं को x86या x64बिल्ड विकल्पों में सेट करें।

  2. Post-Build-Scriptपरियोजना के साथ निम्नलिखित जोड़ें SQLite nuget Package:

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

बेशक आपको इसके लिए स्क्रिप्ट को बदलना होगा Release Buildऔर x86निर्माण करना होगा।


एसटीएल, डॉ;

फ़ाइल के SQLite.Interop.dllबगल में रखें *.exe


6

NuGet से SQLite के मल्टी-आर्किटेक्चर (x86, x64) संस्करण की डिफ़ॉल्ट स्थापना आपके द्वारा वर्णित व्यवहार को प्रदर्शित करती है। यदि आप वास्तविक आर्किटेक्चर के लिए सही संस्करण को लोड करना चाहते हैं, जो .NET रनटाइम ने आपके एप्लिकेशन को आपके मशीन पर चलाने के लिए चुना है, तो आप DLL लोडर को संकेत दे सकते हैं कि सही लाइब्रेरी का पता लगाने के लिए इस प्रकार है:

अपने प्रोग्राम से पहले SetDLLDirectory () के लिए कर्नेल 32.dll फ़ंक्शन कॉल के लिए एक घोषणा जोड़ें।

    [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

यदि आप सभी समस्या को पढ़ना नहीं चाहते हैं, तो समाधान SQLite.Interop.dll के समान पथ में फ़ाइल "msvcr100.dll" (जो कि विंडोज \ System32 निर्देशिका में पाया जा सकता है) की प्रतिलिपि बनाना है।

मैं यह समझने के लिए समस्या को पढ़ने के लिए सलाह दूंगा कि क्यों, और फ़ाइल को अपने सेटअप में शामिल करें लेकिन इसे स्थापित करने के लिए केवल अगर त्रुटि होती है, तो मैंने इसे सेटअप विकल्पों में चयन करने के लिए एक वैकल्पिक घटक बनाया।

HTH, Formentz


इसके लिए बहुत बहुत धन्यवाद, मैंने सब कुछ करने की कोशिश की और यह समाधान था
डेविड बेन्को

4

जैसा कि SQLite विकी कहता है, आपके आवेदन की तैनाती होनी चाहिए:

आवेदन परिनियोजन

इसलिए आपको नियमों का पालन करने की आवश्यकता है। अपने लक्ष्य प्लेटफ़ॉर्म से मेल खाता dll ढूंढें और इसे स्थान पर रखें, चित्र में वर्णन किया गया है। Dll को आपका समाधान / संकुल / System.Data.SQLite.Core।% संस्करण% / में पाया जा सकता है।

मुझे अनुप्रयोग परिनियोजन के साथ समस्याएँ थीं, इसलिए मैंने अभी अपनी परियोजना में सही SQLite.Interop.dll जोड़ा, सेटअप प्रोजेक्ट में AppplicationFolder में जोड़ा x86 फ़ोल्डर और dll में फ़ाइल संदर्भ जोड़े।


3

यदि आप 32 बिट dll, 64 बिट प्रोजेक्ट में चलाने का प्रयास कर रहे हैं, तो आपको यह त्रुटि भी हो सकती है।

मुझे यह तब मिला जब मैंने एक ही फ़ाइल (SQLite.Interop.dll को 32 बिट संस्करण में) दोनों x86 और x64 फ़ोल्डर में रखा है।



3

मुझे नहीं पता कि इसे अभी तक क्यों शामिल नहीं किया गया है, लेकिन मुझे यह शोध करना था और अपने लिए यह पता लगाना था, इसलिए उम्मीद है कि किसी को यह उत्तर मिल जाएगा और परेशानी से बचा जाएगा। यह एक WPF ऐप के लिए था। इसने मेरे देव बॉक्स पर ठीक काम किया, लेकिन उस कंप्यूटर पर काम नहीं किया जहां मैं इसे कॉपी कर रहा था और मुझे Unable to load DLL 'SQLite.Interop.dll'त्रुटि मिली । जब मैंने इसे चलाया तो ओपी के समान त्रुटि होने पर मैंने इसके "डिबग" फ़ोल्डर से सीधे अपने सभी संबंधित निर्देशिकाओं और फाइलों पर पोर्ट कर लिया। मेरे "बिन" फ़ोल्डर में मेरे डीएलएलज़ को "डीबग \ बिन" के लिए कॉपी किया गया था और सभी को शामिल किया गया था, साथ ही मेरे एप्लिकेशन फ़ाइलों के साथ जब मैंने इस पथ का उपयोग करके दूसरे कंप्यूटर पर अपनी प्रतिलिपि बनाई थी, तो यह किसी भी फाइल को याद नहीं कर रहा था।

मैंने देखी गई बातें अन्य उत्तरों में कही हैं जो लागू नहीं हुईं:

  • मैंने NuGet पैकेज का उपयोग नहीं किया या x86 या x64 फ़ोल्डर बनाने की आवश्यकता नहीं है जो ऐसा लगता है कि NuGet पैकेज बनाता है। मेरे DLLs (System.Data.SQLite और SQLite.Interop.dll, System.Data.SQLite.config के साथ) मेरे प्रोजेक्ट में "बिन" फ़ोल्डर में हैं और मैन्युअल रूप से कॉपी किए गए थे (सोल्यूशन एक्सप्लोरर में "बिन" फ़ोल्डर) वीएस, डीएलएल को इस फ़ोल्डर में विंडोज एक्सप्लोरर में पेस्ट करें, वीएस फ़ोल्डर / प्रोजेक्ट में फाइल लाने के लिए Add> मौजूदा आइटम का उपयोग करें। फिर मैं उन्हें उस स्थान ("संदर्भ"> "संदर्भ जोड़ें" का उपयोग करके अपनी परियोजना में संदर्भित असेंबलियों के रूप में संदर्भित करता हूं, और एक को ब्राउज़ करता हूं, कुल्ला करता हूं , बाकी के लिए दोहराता हूं )। यह सुनिश्चित करता है कि मेरा प्रोजेक्ट ठीक-ठीक जानता है कि वे कहाँ हैं।
  • मुझे अपने app.config में किसी भी SQLite DLL फ़ाइल को संदर्भित करने की आवश्यकता नहीं है या यहां तक ​​कि मेरे MyProject.csproj फ़ाइल को भी स्पर्श करें।
  • मुझे किसी विशेष प्रोसेसर को निर्दिष्ट करने की आवश्यकता नहीं थी! मेरी परियोजना का निर्माण "किसी भी सीपीयू" के लिए है, भले ही मेरे पास केवल मिश्रित या 64-बिट डीएलएल है और केवल विंडोज 7+ पर चल रहा होगा, जो 64-बिट ओएस हैं। (कोई x86- केवल / 32-बिट केवल DLL)
  • ओपी की त्रुटि का अनुभव होने पर मैं पहले से ही इन डीएलएल के लिए "कंटेंट" और "कॉपी इफ न्यू" के रूप में निर्दिष्ट कर रहा था।

मैंने जो पाया, वह https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 से था :

(११) अपने आवेदन को चलाने का प्रयास करते समय मुझे DllNotFoundException ("sqlite3.dll" या "SQLite.Interop.dll" के लिए) क्यों मिलती है?

या तो नामांकित डायनेमिक लिंक लाइब्रेरी (DLL) स्थित नहीं हो सकती है या गुम निर्भरता के कारण इसे लोड नहीं किया जा सकता है। सुनिश्चित करें कि नामित डायनामिक लिंक लाइब्रेरी एप्लिकेशन निर्देशिका या सिस्टम PATH के साथ एक निर्देशिका में स्थित है और फिर से प्रयास करें।यह भी सुनिश्चित करें कि जब तक आप एक गतिशील लिंक लाइब्रेरी का उपयोग नहीं कर रहे हैं, तब तक आवश्यक विज़ुअल C ++ रनटाइम पुनर्वितरण स्थापित किया गया है।

पैराग्राफ के अंदर उस बोल्ड भाग पर जोर दें। लक्ष्य कंप्यूटर ताज़ा था और इसमें .NET 4.0 को छोड़कर कोई प्रोग्राम लोड नहीं था। एक बार जब मैंने C ++ इंस्टॉल किया, तो यह SQLite पर कमांड्स को पूरा करने में सक्षम था। यह पहले के अक्सर पूछे जाने वाले प्रश्नों में से एक होना चाहिए था और पूर्व-आवश्यताओं का हिस्सा था, लेकिन इसे # 11 में दफन कर दिया गया था। मेरा विकास कंप्यूटर पहले से ही लोड था क्योंकि यह विजुअल स्टूडियो के साथ आया था, इसलिए इसने वहां काम किया।

डाउनलोड करें:
विज़ुअल स्टूडियो के लिए विजुअल C ++ रिडिजाइएबल 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 को पैकेज (.net) असेंबलियों और पैकेज और देशी dll के प्री-लोड करने के लिए उपयोग करना शुरू कर दिया है। यह बाद में भी मदद करता है, वितरण के साथ ही आप एक फ़ाइल भेज सकते हैं।

  1. Nuget से कॉस्टुरा फोडी स्थापित करें।

  2. आपके C # प्रोजेक्ट में costrua32 नामक एक फ़ोल्डर बनाएँ। वहाँ किसी भी देशी dlls जो आप लोड करने के लिए C # जोड़ें।

  3. एक बार जब आप उन्हें इस फ़ोल्डर में जोड़ लेते हैं। गुण विंडो पर क्लिक करें और बिल्ड एक्शन को "एंबेडेड रिसोर्स" में बदलें

  4. अंत में आपको FodyWeavers.xml नामक XML फ़ाइल में संशोधन करना होगा। यहां मैं पहले sql dll लोड को निर्दिष्ट कर रहा हूं। (आप .dll को छोड़ दें)

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

इसका लाभ यह है कि आपको किसी भी पूर्व या पोस्ट बिल्ड घटनाओं को लिखने की ज़रूरत नहीं है, और अंतिम उत्पाद एक बड़ी फ़ाइल में पूरी तरह से समझाया गया है।


फ़ोल्डर का नाम कॉस्टुरा 32, डॉक्यूमेंटेशन github.com/Fody/Costura#native-lbooks-and-preloadorder
Elton Saunders

3

परीक्षण परियोजना (Nuget Manager के माध्यम से) में dll भी जोड़ा और इसे ठीक कर दिया।


2

मुझे यह समस्या थी क्योंकि Visual C ++ 2010 redistributable मेरे पीसी में स्थापित नहीं है। यदि आपने पहले से Visual c ++ 2010 redistributable डाउनलोड नहीं किया है और इसे डाउनलोड करें (x86 या 64 dll की जाँच करें)।


हाँ। यह मेरा मामला भी था ... केवल मेरे लिए विजुअल C ++ 2010 पुनर्वितरण SP1 की आवश्यकता थी। सर्वश्रेष्ठ आत्मा को ध्यान से पढ़ना है कि आपके संस्करण के लिए कौन से रनटाइम की आवश्यकता है। यहाँ उदाहरण के लिए: system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
वेलजा रेडेंकोविक

नवीनतम लिंक: support.microsoft.com/en-us/help/2977003/…
15

2

मुझे भी यही समस्या हुई। हालांकि, आखिरकार, मैं इसे ठीक कर सकता हूं। वर्तमान में, मैं विजुअल स्टूडियो 2013 कम्युनिटी एडिशन का उपयोग करता हूं। मैं सिर्फ Add-> मौजूदा आइटम का उपयोग करता हूं ... और SQLite.Data.SQLite फ़ाइलों में ब्राउज़ करें (मेरा मामला 'C: \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin' है)। कृपया असेंबली फ़ाइलों के प्रकार को बदलना न भूलें (* .dll; * .pdb) । उस फ़ोल्डर में ' SQLite.Interop.dll ' चुनें । वहां से और फिर, मैं बिना किसी समस्या के जारी रख सकता हूं। आप सबको शुभकामनाएं। ^ _ ^ PS मैं वेब फॉर्म एप्लिकेशन बनाता हूं। मैंने अभी तक विंडो फॉर्म एप्लिकेशन या अन्य में कोशिश नहीं की है।


2

आपके द्वारा बनाए जाने से पहले x86 या x64 (और कोई CPU नहीं) को प्लेटफ़ॉर्म लक्ष्य सेट करने का प्रयास करें: प्रोजेक्ट-> गुण-> बिल्ड-> विज़ुअल स्टूडियो में प्लेटफ़ॉर्म लक्ष्य।


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 संपादन अनुमतियाँ देनी पड़ीं। बस ddl की नकल करने से dll तक पहुंच अस्वीकृत हो रही थी
AlexanderD

इन फ़ाइल को जोड़ने से समस्याएं हल हो गई हैं, लेकिन यह एक अस्थायी समाधान है।
कार्तिक गोयल

2

मैंने इसके लिए लंबे समय तक संघर्ष किया है, और, कभी-कभी, मैंने पाया कि परीक्षण सेटिंग गलत है। इस छवि को देखें: परीक्षण सेटिंग

मैं परीक्षण सेटिंग अनचेक करता हूं, और समस्या गायब हो जाती है। अन्यथा, अपवाद होगा। उम्मीद है, यह किसी की मदद करेगा। सुनिश्चित नहीं है कि इसका मूल कारण है।


1
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
रॉबर्ट कोलंबिया

मेरे मामले में, गवाही फ़ाइल गलत है: <TestSettings ... <परिनियोजन> <परिनियोजन फ़ाइल नाम = "bin \ Relase \ aestest"। फ़ाइल स्थान गलत कॉन्फ़िगर किया गया है।
टोनी सन

2

डीबग फ़ोल्डर में x86 और x64 दोनों के लिए "SQLite.Interop.dll" फ़ाइलों की प्रतिलिपि बनाएँ। इन फ़ाइलों को डीबग फ़ोल्डर में "x86" और "x64 फ़ोल्डर" में कॉपी करना चाहिए।


2

मेरा आवेदन एक वेब अनुप्रयोग है (ASP.NET MVC) और मुझे LocalSystemइसके बजाय चलाने के लिए एप्लिकेशन पूल को बदलना पड़ा ApplicationPoolIdentity। यह करने के लिए:

  1. IIS प्रबंधक खोलें
  2. अपनी साइट के अंतर्गत चल रहे एप्लिकेशन पूल का पता लगाएं।
  3. क्रियाओं से उन्नत सेटिंग्स पर क्लिक करें
  4. करने के लिए पहचान बदलें LocalSystem

मुझे नहीं पता कि यह समस्या को ठीक क्यों करता है।


1

मुझे नहीं पता कि यह एक अच्छा जवाब है, लेकिन मैं "स्थानीय प्रणाली" की पहचान के साथ एक AppDomain के तहत अपना आवेदन चलाकर इस समस्या को हल करने में सक्षम था।


1

मैं एक SQLite डेटाबेस में कुछ परीक्षण डेटा जोड़ने के लिए एक साधारण कंसोल एप्लिकेशन पर काम कर रहा हूं और यह त्रुटि प्राप्त कर रहा था। परियोजना के लिए कॉन्फ़िगरेशन "कोई भी सीपीयू" है। मैंने इसे SQLite.Interop.dll को bin \ debug फ़ोल्डर में कॉपी करके ठीक किया। एक बेहतर तरीका यह होगा कि आप इस विधि का उपयोग करें @


1

क्या विधानसभा के लिए विवाद हो सकता है? यह देखने के लिए जांचें कि DLL पर फ़ाइल लॉक के साथ कोई अन्य एप्लिकेशन है या नहीं।

यदि यह कारण है, तो आक्रामक प्रोग्राम को खोजने के लिए Sysinternal के प्रोसेस एक्सप्लोरर जैसे टूल का उपयोग करना आसान होना चाहिए ।

एचटीएच, क्ले


1

इस प्रश्न को देखने वाले किसी भी व्यक्ति के संदर्भ के लिए:

यदि आप नगेट पैकेज का उपयोग करते हैं, तो यह एक बिल्ड नियम स्थापित करता है जो आपके लिए कॉपी करता है। (System.Data.SQLite.Core.1.0.94.0 \ build के तहत देखें - या कोर का जो भी संस्करण आप स्थापित करें)।

नगेट इंस्टॉलर आपके प्रोजेक्ट फ़ाइल में नियम को स्वचालित रूप से जोड़ता है।

यह अभी भी हालांकि परीक्षण मामले की समस्या को ठीक नहीं करता है। परिनियोजनआइटम ( https://stackoverflow.com/a/24411049/89584 ) एक ही चीज़ है जो वहां काम करती है।


1

मैं एक वेबएपीआई / एमवीसी 5 वेब परियोजना और एक फ़ीचर टेस्ट परियोजना के साथ एक समाधान में, इस समस्या से भाग गया, कि दोनों ने एक ही डेटा एक्सेस (या, 'कोर') परियोजना को छोड़ दिया। मैं, यहाँ कई अन्य लोगों की तरह, विजुअल स्टूडियो 2013 में NuGet के माध्यम से डाउनलोड की गई कॉपी का उपयोग कर रहा हूं।

मैंने जो किया था, वह Visual Studio में एक x86 और x64 समाधान फ़ोल्डर में फ़ीचर टेस्ट और वेब प्रोजेक्ट्स में जोड़ा गया था। मैंने तब Right Click | Add Existing Item...उनमें से ..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]प्रत्येक के लिए उपयुक्त SQLite.interop.dll लाइब्रेरी जोड़ी थी । मैंने तब ए Right Click | Propertiesऔर सेट Copy to Output Directoryकिया था Always Copy। अगली बार जब मुझे अपना फीचर परीक्षण चलाने की आवश्यकता हुई, तो परीक्षण सफलतापूर्वक चला।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.