c# - DLL 'SQLite.Interop.dll লোড করতে অক্ষম'




visual-studio-2010 (20)

মাঝে মাঝে আমি নিম্নলিখিত ব্যতিক্রম পাচ্ছি:

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

আমি 1.0.82.0 ব্যবহার করছি। সংস্করণ, VS2010 মধ্যে nuget সঙ্গে এটি ইনস্টল, ওএস Win7 64।

একবার ব্যতিক্রম প্রদর্শিত হতে শুরু করে, এটি ক্রমাগত প্রদর্শিত হয় - ডিবাগ এবং রিলিজ এবং চলমান অ্যাপ্লিকেশন VS এর বাইরে বা বাইরে।

এটি বন্ধ করার একমাত্র উপায় লগঅফ এবং লগঅন। ব্যতিক্রম নিক্ষেপ করা হয় না এবং ডিল লোড করা হয়। এটা দিনের জন্য কাজ করতে পারে, কিন্তু তারপর এটি আবার বিরতি করতে পারেন।

কেউ কি এমন কিছু দেখেছে এবং এর জন্য কোন সমাধান আছে?


NuGet থেকে SQLite এর মাল্টি-আর্কিটেকচারের ডিফল্ট ইনস্টলেশন (x86, x64) সংস্করণটি বর্ণিত আচরণটি প্রদর্শন করে। আপনি যদি আপনার মেশিনে আপনার অ্যাপ্লিকেশন চালানোর জন্য নির্বাচিত নেট আর্কিটেকচারের সঠিক সংস্করণটি লোড করতে চান তবে আপনি DLL লোডারটিকে নিম্নরূপ সঠিক লাইব্রেরীটি কোথায় স্থাপন করতে হবে সে সম্পর্কে একটি ইঙ্গিত দিতে পারেন:

আপনার প্রোগ্রামের আগে SetDLLDirectory () এ kernel32.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));

আপনি যদি 64 বিট প্রজেক্টে 32 বিট ডিল চালানোর চেষ্টা করেন তবে আপনিও এই ত্রুটিটি পেতে পারেন।

X86 এবং x64 ফোল্ডারে আমি একই ফাইল (32 বিট সংস্করণে SQLite.Interop.dll) স্থাপন করার পরে এটি পেয়েছি।


আমার এই সমস্যা ছিল কারণ আমি যে DLL ব্যবহার করছিলাম সেটি স্ল্লাইটের নির্ভরতা হিসাবে ছিল (নুগেটে কনফিগার করা শুধুমাত্র স্কলাইট কোর প্যাকেজের সাথে।)। প্রকল্পটি SQLite.Interop.dll (উভয় x86 এবং x64 ফোল্ডার) ব্যতীত সমস্ত স্ল্লাইট ডিল-এসগুলিকে কম্পাইল এবং কপি করে।

সমাধানটি খুব সহজ ছিল: আপনি যে প্রকল্পটি নির্মাণ / চলমান করছেন তার জন্য কেবলমাত্র সিক্লাইট.কোরা প্যাকেজটিকে নির্ভরতা (NuGet এর সাথে) যুক্ত করুন এবং ডিল-এসগুলি অনুলিপি করা হবে।


আমার এই সমস্যা ছিল কারণ ভিসুয়াল সি ++ ২010 পুনরায় বিতরণযোগ্য আমার পিসিতে ইনস্টল হয়নি। আপনি যদি ইতিমধ্যে ভিসুয়াল সি ++ ২010 পুনরায় বিতরণযোগ্য ইনস্টল না করে থাকেন তবে এটি Download এবং ইনস্টল করুন (x86 বা 64 dll দেখুন)।


আমি SQLite ডেটাবেসে কিছু পরীক্ষা ডেটা যোগ করার জন্য একটি সহজ কনসোল অ্যাপ্লিকেশনটিতে কাজ করছি এবং এই ত্রুটিটি পেয়েছি। প্রকল্পের জন্য কনফিগারেশন "কোন CPU" হয়। আমি SQLite.Interop.dll bin \ debug ফোল্ডারে অনুলিপি করে এটি সংশোধন করেছি। @ ওয়েল দ্বারা পদ্ধতিটি ব্যবহার করা আরও ভাল উপায়, তবে আপনি "কোনও CPU" কনফিগারেশনের জন্য এটি কীভাবে উল্লেখ করবেন?


আমি আমার প্রকল্পে এটি কিভাবে সংশোধন করা হয়।

এটি কাজ করছে, এবং যখন একজন সহকর্মী তার পরিবর্তনগুলি জমা দেয়, তখন আমি "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>

ফিরে আসার পর, আমি ব্যতিক্রম পাইনি। ডিএলএল ফাইলগুলি উপযুক্ত ডিবাগ \ x64 (ইত্যাদি) ফোল্ডারগুলিতে ডাম্প করা হয়েছিল।


আমি একই সমস্যা পেয়েছিলাম। যাইহোক, অবশেষে, আমি এটা ঠিক করতে পারেন। বর্তমানে, আমি ভিজ্যুয়াল স্টুডিও 2013 সম্প্রদায় সংস্করণ ব্যবহার করি। আমি শুধু Add-> বিদ্যমান আইটেমটি ব্যবহার করি ... এবং যেখানে SQLite.Data.SQLite ফাইলগুলি রয়েছে তা ব্রাউজ করুন (আমার ক্ষেত্রে 'C: \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin')। আপনি সমাবেশ ফাইল (* .dll; * .pdb) অন্তর্ভুক্ত হবে কি ধরনের পরিবর্তন করতে ভুলবেন না দয়া করে। যে ফোল্ডারে ' SQLite.Interop.dll ' চয়ন করুন। তারপর থেকে, আমি কোন সমস্যা ছাড়াই অবিরত করতে পারেন। তোমাদের সবার জন্য শুভ কামনা। ^ _ ^ পিএস আমি ওয়েব ফর্ম আবেদন তৈরি। আমি এখনও উইন্ডো ফর্ম আবেদন বা অন্যদের চেষ্টা করেনি।


আমি একটি একাধিক প্রকল্প সমাধান অনুরূপ সমস্যা ছিল। ClickOnce ব্যবহার করে সফটওয়্যার দিয়ে বিতরণ করা প্লাগিনগুলির জন্য SQLite.Interop.dll প্রয়োজনীয় ছিল।

যতক্ষণ পর্যন্ত ভিজ্যুয়াল স্টুডিওতে ডিবাগিং সবকিছু জরিমানা করে, তবে নিযুক্ত সংস্করণটি x86 / এবং x64 / ফোল্ডারটি ডিএলএল ধারণকারী অনুপস্থিত ছিল।

ClickOnce ব্যবহার করে স্থাপনার পরে এটি কাজ করার সমাধানটি এই দুটি সাবফোল্ডারের স্টার্টআপ প্রজেক্টে তৈরি করা হয়েছে (এছাড়াও প্রকাশ করা হচ্ছে), তাদের মধ্যে DLL অনুলিপি করুন এবং সর্বদা সামগ্রী অনুলিপি হিসাবে সেট করুন।

এইভাবে ClickOnce প্রকাশনার সরঞ্জামটি ম্যানিফেস্টে এই ফাইলগুলি এবং ফোল্ডারগুলি স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করে এবং তাদের সাথে সফ্টওয়্যার স্থাপন করে


আমি কস্টুর ব্যবহার শুরু করেছি। প্যাকেজ (.net) অ্যাডমিনিস্ট্রেটস এবং এম্বেড এবং নেটিভ dlls preload। এটি আপনি পরে একটি ফাইল প্রেরণ হিসাবে বিতরণ, পরে সাহায্য করে।

  1. Nuget থেকে কোস্টুর Fody ইনস্টল করুন।

  2. আপনার সি # প্রোজেক্টে costrua32 নামে একটি ফোল্ডার তৈরি করুন। সেখানে কোনও স্থানীয় ডিলগুলি যুক্ত করুন যা C # লোড করতে পারে।

  3. একবার আপনি এই ফোল্ডারে তাদের যোগ করেছেন। বৈশিষ্ট্য উইন্ডোতে ক্লিক করুন এবং "এম্বেডেড সংস্থান" এ বিল্ড অ্যাকশন পরিবর্তন করুন।

  4. অবশেষে আপনাকে নিম্নরূপ FodyWeavers.xml নামে এক্সএমএল ফাইলটি সংশোধন করতে হবে। এখানে আমি এসকিউএল ডিল লোড প্রথম উল্লেখ করা হয়। (নোট আপনি ড্রপ নোট।)

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

এর সুবিধা হল আপনাকে কোন প্রাক বা পোস্ট বিল্ড ইভেন্ট লিখতে হবে না এবং শেষ পণ্য সম্পূর্ণরূপে একটি বৃহত ফাইলের মধ্যে অন্তর্ভুক্ত করা হয়।


আমি জানি না কেন এটি এখনো অন্তর্ভুক্ত করা হয়নি, তবে আমাকে গবেষণা করতে হয়েছিল এবং নিজের জন্য এটি খুঁজে বের করতে হয়েছিল, তাই আশা করছি কেউ এই উত্তরটি পাবে এবং সমস্যাটি বাঁচাবে। এটি একটি WPF অ্যাপ্লিকেশন জন্য ছিল। এটি আমার ডেভ বক্সে জরিমানা কাজ করেছে, তবে আমি যেখানে এটি অনুলিপি করছিলাম সেখানে কম্পিউটারে কাজ করে নি এবং Unable to load DLL 'SQLite.Interop.dll' ত্রুটিটি Unable to load DLL 'SQLite.Interop.dll' । যখন আমি এটি চালাচ্ছিলাম OP এর মতো একই ত্রুটি পেয়েছিলাম তখন আমি আমার অন্যান্য ডিবাগ ফোল্ডার থেকে সরাসরি এই "ডিবাগ" ফোল্ডার থেকে সমস্ত সম্পর্কিত ডিরেক্টরি এবং ফাইলগুলিতে পোর্ট করেছিলাম। আমার "bin" ফোল্ডারটিতে আমার ডিএলএলগুলি "ডিবাগ \ bin" তে অনুলিপি করা হয়েছে এবং আমার অ্যাপ্লিকেশন ফাইলগুলি সহ এই সমস্ত ফাইল ব্যবহার করে অন্য কম্পিউটারে অনুলিপি করা হয়েছে, তাই এটি কোন ফাইল অনুপস্থিত ছিল না।

যেসব বিষয় আমি দেখেছি সেগুলি অন্যান্য উত্তরগুলিতে বলেছিল যা প্রযোজ্য নয়:

  • আমি NuGet প্যাকেজটি ব্যবহার করিনি অথবা এটি x86 বা x64 ফোল্ডারগুলি তৈরি করতে হবে যা মনে হয় যে NuGet প্যাকেজ তৈরি করে। আমার DLLs (System.Data.SQLite এবং SQLite.Interop.dll, System.Data.SQLite.config সহ) আমার প্রোজেক্টের "বিন" ফোল্ডারে রয়েছে এবং ম্যানুয়ালি অনুলিপি করা হয়েছে (সলিউশন এক্সপ্লোরারে "বিন" ফোল্ডার তৈরি করুন ভিএস, উইন্ডোজ এক্সপ্লোরারে এই ফোল্ডারে DLL টি পেস্ট করুন, VS ফোল্ডার / প্রকল্পে ফাইলগুলি আনতে বিদ্যমান আইটেম যুক্ত করুন ব্যবহার করুন)। তারপরে আমি সেই অবস্থানটি ব্যবহার করে আমার প্রকল্পে রেফারেন্সযুক্ত অ্যাসেম্বলি হিসাবে উল্লেখ করি ("রেফারেন্সস"> "রেফারেন্স যোগ করুন", এবং একটিকে ব্রাউজ করুন, বিশ্রাম করুন, বিশ্রামের জন্য পুনরাবৃত্তি করুন)। এই আমার প্রকল্প ঠিক যেখানে তারা নিশ্চিত করে তোলে।
  • আমার app.config এ যেকোনো SQLite DLL ফাইলকে রেফারেন্স করার দরকার নেই বা এমনকি আমার MyProject.csproj ফাইলটি স্পর্শ করুন।
  • আমি এমনকি একটি নির্দিষ্ট প্রসেসর নির্দিষ্ট করার প্রয়োজন ছিল না! আমার প্রোজেক্টের বিল্ড "কোনও CPU" এর জন্য, যদিও আমার কাছে মিশ্র বা 64-বিট DLL রয়েছে এবং উইন্ডোজ 7+ এ চলবে, যা 64-বিট OSes। (কোন x86-only / 32-bit শুধুমাত্র DLLs)
  • যখন আমি অপারেটিং সিস্টেমের ত্রুটির সম্মুখীন হয়েছি তখন আমি এই ডিএলএলগুলির জন্য ইতোমধ্যে তাদের "বিষয়বস্তু" হিসাবে উল্লেখ করছি এবং "নতুন হলে অনুলিপি করি"।

আমি যা পাই তা হল, https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :

(11) আমার আবেদন চালানোর চেষ্টা করার সময় কেন আমি একটি DllNotFoundException ("sqlite3.dll" বা "SQLite.Interop.dll") পেতে পারি?

হয় নামযুক্ত ডাইনামিক লিঙ্ক লাইব্রেরি (DLL) স্থাপন করা যাবে না বা এটি হারিয়ে যাওয়া নির্ভরতার কারণে লোড করা যাবে না। নামযুক্ত ডাইনামিক লিঙ্ক লাইব্রেরি অ্যাপ্লিকেশন ডিরেক্টরি বা সিস্টেম PATH বরাবর একটি ডিরেক্টরির মধ্যে অবস্থিত নিশ্চিত করুন এবং আবার চেষ্টা করুন। এছাড়াও, নিশ্চিত হোন যে প্রয়োজনীয় ভিসুয়াল সি ++ রানটাইম পুনরায় বিতরণযোগ্য ইনস্টল করা হয়েছে যদি না আপনি একটি ডায়নামিক লিঙ্ক লাইব্রেরি ব্যবহার করেন যা এটির সাথে স্ট্যাটিক্যাল লিঙ্কযুক্ত হয়েছিল।

অনুচ্ছেদ ভিতরে যে সাহসী অংশ উপর চাপ খনি। লক্ষ্য কম্পিউটারটি তাজা ছিল এবং .NET 4.0 ব্যতীত কোনও প্রোগ্রাম লোড করা হয়নি। একবার সি ++ ইনস্টল করলে, এটি SQLite এ কমান্ডগুলি সম্পূর্ণ করতে সক্ষম হয়েছিল। এটি প্রথম প্রশ্নাবলী এবং পূর্ব-প্রয়োজনীয়তার অংশ হতে পারে তবে এটি # 11 এ দাফন করা হয়েছিল। আমার ডেভেলপমেন্ট কম্পিউটারটি ইতোমধ্যে লোড হয়েছে কারণ এটি ভিজ্যুয়াল স্টুডিওর সাথে এসেছে, তাই এটি সেখানে কাজ করেছে।

ডাউনলোড করুন:
ভিসুয়াল সি ++ ভিজ্যুয়াল স্টুডিও 2015 এর জন্য পুনরায় বিতরণযোগ্য:
https://www.microsoft.com/en-us/download/details.aspx?id=48145

আপডেট 3 (ক্রমবর্ধমান আপডেট):
https://www.microsoft.com/en-us/download/details.aspx?id=53587


আমি দীর্ঘ সময়ের জন্য এটির সাথে লড়াই করেছি, এবং মাঝে মাঝে, আমি দেখেছি যে পরীক্ষা সেটিংটি ভুল। এই ছবিটি দেখুন:

আমি শুধু পরীক্ষা সেটিং অচিহ্নিত, এবং সমস্যা অদৃশ্য। অন্যথা, ব্যতিক্রম ঘটবে। আশা করি, এই কেউ সাহায্য করবে। এটা মূল কারণ নিশ্চিত না।


এখানে অনেকগুলি উত্তর আছে, কিন্তু আমার -জিএসি-বাজানো-আশপাশের সাথে খালি সহজ এবং পরিষ্কার।

সমস্যা ছিল, এক্সিকিউটেবল ফাইলটি আমাদের ডাটাবেস অ্যাক্সেস করতে ডান SQLite.Interop.dll (x86 বা x64) এর একটি অনুলিপি দরকার।

বেশিরভাগ আর্কিটেকচারের স্তর রয়েছে এবং আমার ক্ষেত্রে ডেটা লেয়ারের SQLite সংযোগের জন্য প্রয়োজনীয় DLL রয়েছে।

তাই আমি সহজেই আমার ডেটা লেয়ার সলিউশনে একটি পোস্ট বিল্ড স্ক্রিপ্ট রাখি এবং সবকিছু ঠিকঠাক কাজ করে।

টি এল; ডিআর;

  1. বিল্ড অপশনগুলিতে x86 বা x64 এ আপনার সমাধানগুলির সমস্ত প্রকল্প সেট করুন।
  2. SQLite nuget Package সাথে প্রকল্পে নিম্নলিখিত Post-Build-Script যোগ করুন:

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

অবশ্যই আপনাকে Release Build এবং x86 builds এর জন্য স্ক্রিপ্ট পরিবর্তন করতে হবে।

STL; ডিআর;

*.exe SQLite.Interop.dll ফাইলের পাশে আপনার SQLite.Interop.dll রাখুন।


এটি একটি ভাল উত্তর কিনা তা আমি জানি না, তবে আমি "স্থানীয় সিস্টেম" এর পরিচয় দিয়ে অ্যাপডোমাইনের অধীনে আমার অ্যাপ্লিকেশন চালানোর মাধ্যমে এই সমস্যার সমাধান করতে সক্ষম হয়েছিলাম।


এমনকি এটি একটি পুরানো পোস্ট হলেও আমি এখানে পাওয়া সমাধানটি ভাগ করতে চাই: http://system.data.sqlite.org/index.html/info/54e52d4c6f

আপনি যদি সমস্ত সমস্যা পড়তে না চান তবে সমাধানটি "msvcr100.dll" (যা উইন্ডোজ \ System32 ডিরেক্টরিতে পাওয়া যাবে) অনুলিপি করতে হবে SQLite.Interop.dll হিসাবে একই পথে।

কেন আমি সমস্যার সমাধান করতে এবং আপনার সেটআপে ফাইলটি অন্তর্ভুক্ত করতে সমস্যাটি পড়তে পরামর্শ দেব তবে ত্রুটিটি কেবলমাত্র এটি ইনস্টল করার জন্য, আমি সেটআপ বিকল্পগুলিতে এটি একটি ঐচ্ছিক উপাদান নির্বাচনযোগ্য করে তুলি।

এইচটিইউ, ফরমেজ


প্রকল্প ডিরেক্টরির মধ্যে 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

প্ল্যাটফর্ম লক্ষ্যটি x86 বা x64 (এবং কোনও সিপিও নয়) এ আপনার তৈরি করার আগে প্ল্যাটফর্ম লক্ষ্য নির্ধারণ করার চেষ্টা করুন: প্রকল্প-> বৈশিষ্ট্যাবলী-> বিল্ড-> ভিজ্যুয়াল স্টুডিওতে প্ল্যাটফর্ম লক্ষ্য।


যে কেউ এই প্রশ্নের দিকে তাকানোর জন্য রেফারেন্সের জন্য:

আপনি nuget প্যাকেজ ব্যবহার করলে, এটি একটি বিল্ড নিয়ম ইনস্টল করে যা আপনার জন্য অনুলিপি করে। (System.Data.SQLite.Core.1.0.94.0 \ build- এর অধীনে দেখুন অথবা কোরের যে কোনও সংস্করণ ইনস্টল করুন)।

Ngetget installer স্বয়ংক্রিয়ভাবে আপনার প্রকল্প ফাইল থেকে নিয়ম যোগ করে।

এই এখনও পরীক্ষা ক্ষেত্রে সমস্যা ঠিক করা হয় না। স্থাপনার আইটিম ( https://.com/a/24411049/89584 ) পদ্ধতিটি এমন একটি জিনিস যা সেখানে কাজ করে বলে মনে হয়।


সমাবেশের জন্য কি তর্ক হতে পারে? DLL এ একটি ফাইল লক দিয়ে অন্য অ্যাপ্লিকেশন আছে কি না তা পরীক্ষা করে দেখুন।

এই কারণে, আপসিং প্রোগ্রাম আবিষ্কার করার জন্য Sysinternal এর প্রসেস এক্সপ্লোরারের মত একটি সরঞ্জাম ব্যবহার করা সহজ হওয়া উচিত।

এইচটিএ, ক্লে


SQLite উইকি বলছে, আপনার অ্যাপ্লিকেশন স্থাপনার অবশ্যই হতে হবে:

সুতরাং আপনি নিয়ম অনুসরণ করতে হবে। আপনার টার্গেট প্ল্যাটফর্ম সাথে মেলে এবং dll খুঁজে পেতে, ছবি বর্ণনা করে অবস্থান। আপনার Solution / প্যাকেজ / System.Data.SQLite.core.% সংস্করণ% / এ পাওয়া যাবে।

আমি অ্যাপ্লিকেশন স্থাপনার সাথে সমস্যা ছিল, তাই আমি ঠিক আমার প্রোজেক্টে SQLite.Interop.dll যুক্ত করেছি, সেটআপ প্রকল্পে অ্যাডপ্লিকেশনফোলারে যোগ করা x86 ফোল্ডারটি এবং dll এ ফাইল রেফারেন্স যোগ করা হয়েছে।


Tools -> Extension and updates থেকে এক্সগেনশন Tools -> Extension and updates এবং SQLite.Core পুনরায় ইনস্টল করা PM> Update-Package -reinstall System.Data.SQLite.Core কমান্ড PM> Update-Package -reinstall System.Data.SQLite.Core এটিকে আমার জন্য সংশোধন করে।