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에서 nuget으로 설치

예외가 나타나기 시작하면 디버그 및 릴리스 및 VS 내부 또는 외부의 응용 프로그램에서 지속적으로 나타납니다.

이를 중지하는 유일한 방법은 로그 오프 및 로그온입니다. 예외가 발생하지 않고 dll이로드됩니다. 그것은 며칠 동안 작동 할 수 있지만 다시 깨질 수 있습니다.

누구든지 이와 같은 것을 보았고 그에 대한 해결책이 있습니까?


2
예, 항상 복사하도록 설정되어 있습니다. bin / debug에 x64 및 x86 폴더가 있습니다. 그리고 그것은 대부분 작동하지만 때로는 작동을 멈 춥니 다. 아마도 무언가가 dll에 대한 액세스를 차단하고 있습니다. 다음에 작동을 멈출 때 찾아 낼 것입니다. 내가 말했듯이 아무런 문제없이 며칠 동안 작동 할 수 있습니다.
xll

13
SQLite nuget 패키지를 새 콘솔 프로젝트에 추가 한 후 즉시이 오류가 발생했습니다. x86 폴더에서 SQLite.Interop.dll을 한 수준 위로 수동으로 복사하면 앱을 실행할 수 있습니다. 나에게 이것이 이상하게 보일 것 같았다.
lesscode

@ Wayne 예, 이것은 확실히 도움이됩니다. 그러나 제 경우에는 프로젝트를 함께 진행하고 있으며 친구는 x86을 사용하고 x64 OS를 사용하고 있습니다. 그리고 내가 알다시피, 때로는 작동하지 않습니다. 지난 달에 그런 일은 없었지만
xll December

1
SQLite에 대한 올바른 바이너리를 다운로드 한 경우 프로젝트 빌드 옵션에 따라 SQLite.Interop.dll을 Release 또는 Debug 폴더에 복사하십시오.
Elshan

이것은 임의의 버그입니다 ... 때로는 발생하며 때로는 내 프로젝트에 적합하지 않습니다. 모든 것을 시도했다.
BK

답변:


140

나는 파티에 늦었다는 것을 알고 있지만 오늘 최신 x86 / x64 (버전 1.0.88.0)를 철회 한 직후이 문제가 발생했습니다. VS2012의 로컬 IIS는 기본적으로 32 비트를 실행하며 x64로 쉽게 전환 할 수있는 방법이 없습니다. 내 프로덕션 서버는 64 비트를 실행합니다.

어쨌든 NuGet 패키지를 DLL 프로젝트에 설치 했는데이 오류가 발생했습니다. 작동시키기 위해해야 ​​할 일은 메인 사이트 프로젝트에도 설치해야했습니다 . SQLite 클래스에 전혀 영향을 미치지 않더라도.

내 생각에 SQLite는 엔트리 어셈블리를 사용하여로드 할 Interop 버전을 감지합니다.


11
NuGet을 사용하여 SQLite Core에 대한 참조를 기본 프로젝트에 추가 한 후 나에게 도움이되었습니다.
Luca Cremonesi

메인 프로젝트에 sqllite.core를 추가하면 WPF 솔루션에서 효과가있었습니다
Dipu Raj

db 호출이 라이브러리에 있더라도 install-package Sqlite와 Install-Package System.Data.SQLite.Core를 내 웹 사이트에 모두 수행해야했습니다.

이것이 답이되어야합니다.
바비 투르 칼리 노

4
"메인 사이트"프로젝트는 무엇을 의미합니까? 제 경우에는 데스크탑 작업을하고 있습니다. "스타트 업"프로젝트를 의미합니까?
UuDdLrLrSs

60

내가 사용하고있는 dll이 Sqlite를 종속성으로 가지고 있기 때문에이 문제가 발생했습니다 (Sqlite 코어 패키지 만 사용하여 NuGet에서 구성됨). 이 프로젝트는 'SQLite.Interop.dll'(x86 및 x64 폴더 모두)을 제외한 모든 Sqlite dll을 컴파일하고 복사합니다.

해결책은 매우 간단합니다. Sqlite.Core 패키지를 빌드 / 실행중인 프로젝트에 의존성 (NuGet 사용)으로 추가하면 dll-s가 복사됩니다.


나를 위해 일했다! 감사합니다
Tristan Djahel 2016 년

동의했다. 'Sqlite.Net PCL'패키지를 사용하고 있지만 'System.Data.SQLite Core (x86 / x64)'도 필요하다는 것을 알았습니다. 또한 '모든 CPU'가 아닌 'x86'또는 'x64'의 플랫폼 대상을 사용하도록 참조하는 프로젝트를 변경해야했습니다.
앤드류 스티븐스

2
여기에 게시 된 몇 가지 솔루션을 시도했지만 실제로 가장 잘 해결되었습니다.
배트맨

2
그런 의존성을 어떻게 추가 할 수 있습니까? (VS2013)를 해본 적이
jpgrassi

3
도구-> NuGet 패키지 관리자-> 솔루션의 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>

VS 2010을 사용하고 있는데 그러한 옵션이 없습니다.
xll

@ xll, 설명을 위해 답을 편집했습니다. 편집 내용이 지워 졌는지 확인하십시오.
Caleb Kiage

10
VS2012에서는이 옵션이 회색으로 표시됩니다.
Kugel

6
이 옵션은 EXE 프로젝트에서만 사용할 수 있지만 대부분의 사람들은 단위 테스트 프로젝트 에서이 문제가 있다고 생각합니다.
Brannon

1
VS Pro 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 파일은 적절한 Debug \ x64 (etc) 폴더에 덤프되었습니다.


"SQLite.Interop.dll"에 대한 <itemgroup>이 프로젝트의 .csproj 파일에 없습니다. 여전히 귀하의 솔루션을 추가하려고했지만 작동하지 않았습니다 :(
ayc

VS2012에서는 작동하지 않으며 요소가 없습니다.
htm11 시간

대단히 감사합니다. 2015 년 대
Jevgenij Kononov

29

따라서 NuGet을 추가 한 후 배포시 Interops가 복사되지 않습니다. 이것을 csproj 파일에 추가하면 해당 동작을 수정해야합니다.

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

NuGet for SQLite의 소스를 보면 이들이 구체적으로 무엇을하고 있는지 확인할 수 있습니다. 이를 통해 ASP.Net Core로 작업 할 수 있습니다.


10
ContentSQLiteInteropFiles가 답입니다. 최고의 답변은 대부분 추측입니다.
Corey Alix

6
예, ContentSQLiteInteropFiles가 답입니다. 1. 이것은 정답이되어야합니다. 2. 반면에, 너겟 패키지로서이 작업을 자동으로 수행하는 방법 또는 최소한이 구성의 필요성을 문서화하는 방법을 조사해야합니다.
gerleim

허용되는 답변이어야합니다. 매우 간단합니다. 1. 프로젝트 언로드 2. 위의 csproj 추가 3. 프로젝트 재로드. 쉬운 일입니다.
BillRuhl

24

이 상태가되면 Rebuild-All을 수행하십시오. 이렇게해도 문제가 해결되면 같은 문제가있을 수 있습니다.

일부 배경 (내 이해) :

  • SQLite에는 1 개의 관리되는 어셈블리 (System.Data.SQLite.dll)와 여러 플랫폼 별 어셈블리 (SQLite.Interop.dll)가 있습니다. Nuget과 함께 SQLite를 설치할 때 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를 사용하여 Post-Build 프로세스를 추가하여 \ x86 및 \ x64 폴더를 클래스 라이브러리에서 WPF 프로젝트 \ bin 디렉토리로 강제 복사했습니다.

또는 빌드 구성 / 출력 디렉토리로 더 멋진 작업을 수행 할 수 있습니다.


1
내가받은 메시지는 해당 파일이 누락되었다고 말했지만 권한 문제라고 생각했습니다. 메시지를 보았을 때 배포 할 때 서버에 실제로 메시지를 보내지 않는다는 것을 깨달았습니다.
Stradas

1
거의 동일한 해결책은 x86 및 x64 폴더를 시작 프로젝트에 추가 한 다음 해당 폴더 내에 x86 interop 및 x64 interop 파일을 추가하는 것입니다. 파일 옵션을 "content"및 "build always"로 설정했습니다. 이것은 ClickOnce를 사용하여 다른 PC에 앱을 배포 할 때 Windows Forms 앱이 포함 된 s3db 데이터베이스 파일에 연결할 수있는 유일한 방법입니다. 실망스럽게도 PC에서 앱을 개발하고 테스트 할 때 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을 실행하는 것과 동일한 문제가 발생했습니다. 여기 및 다른 곳에서 언급하지 않은 여러 가지 솔루션을 사용해 보았습니다. 이 수정 프로그램이 다른 사람에게 도움이되기를 바랍니다.

속성 을 사용하여 수정했습니다.DeploymentItemSQLite 기반 서비스를 테스트하는 테스트 클래스 을 .

예:

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

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

이로 인해 필요한 부분 SQLite.Interop.dllx86 "TestResults"폴더 내의 디렉토리로 합니다.

모두 녹색입니다. 모두 좋은.


1
당신이 Microsoft.VisualStudio.TestTools.UnitTesting 네임 스페이스를 사용하는 경우이 솔루션은 작동
sapbucket

4
MSTest를 사용하는 경우 올바른 솔루션입니다. SQLite는 테스트에 DeploymentItem ( "some.csv")을 사용할 때까지 문제없이 SQLite.Interop.dll을 찾는 데 문제가 없었습니다. 그런 식으로 .csv 파일을 포함 시키면 MSTest가 모든 참조 된 dll을 TestResults 디렉토리로 복사하도록 트리거했습니다. SQLite.Interop.dll은 프로젝트에서 참조되지 않으므로 (관리되지 않는 코드이기 때문에) 복사되지 않았습니다.
Johann

가장 좋은 방법은 각 아키텍처마다 하나씩 두 줄을 추가하는 것입니다. 테스트 러너가 64 비트로 실행되는 경우이를 보호합니다.
Kirk Woll

13

Tools -> Extension and updatesNuite를 업데이트 하고 SQLite.Core를 다시 설치하면 명령이 PM> Update-Package -reinstall System.Data.SQLite.Core수정되었습니다.


이 작업을 수행 할 때 오류가 발생하면 SQLite DLL / 참조를 제거하고 nuget에서 완전히 다시 설치하면 문제가 해결되었습니다.
KayakinKoder

sqllite core help도 다시 설치하십시오. VS2012에서 발생했습니다. VS는 웹 배포 패키지에 x62 버전을 포함하지 않았습니다
Andrey R

VS2015 Professional에서도 해결되었습니다.
Rahul Kishore

9

여러 프로젝트 솔루션에서 비슷한 문제가 발생했습니다. ClickOnce를 사용하여 소프트웨어와 함께 배포 된 플러그인 중 하나에 SQLite.Interop.dll이 필요했습니다.

Visual Studio에서 디버깅하는 한 모든 것이 잘 작동했지만 배포 된 버전에는 해당 DLL을 포함하는 x86 / 및 x64 / 폴더가 누락되었습니다.

ClickOnce를 사용하여 배포 한 후이 솔루션을 작동시키는 솔루션은 솔루션의 시작 프로젝트 (이 중 게시 된 것도 하나)에서이 두 하위 폴더를 만들어 DLL에 복사 한 다음 Content Copy Always로 설정하는 것입니다.

이런 식으로 ClickOnce 게시 도구는 이러한 파일과 폴더를 매니페스트에 자동으로 포함하고 소프트웨어와 함께 배포합니다


1
이것은 나를 위해 일한 유일한 솔루션이었습니다 ... 그리고 소년 .... 앱이 사용자의 PC에서 닫힐 때 디버그하는 것이 고통 스럽습니다.
stoic

8

여기에는 실제로 많은 답변이 있지만 GAC를 재생하지 않고 간단하고 명확 합니다 .

문제는 실행 파일이 SQLite.Interop.dll데이터베이스에 액세스하기 위해 오른쪽 (x86 또는 x64) 의 사본이 필요하다는 것입니다.

대부분 아키텍처에는 레이어가 있으며 필자의 경우 데이터 레이어 에는 SQLite 연결에 필요한 DLL이 있습니다.

그래서 간단하게 포스트 빌드 스크립트를 내 데이터 레이어 솔루션에 넣고 모든 것이 잘 작동했습니다.


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

NuGet에서 다중 아키텍처 (x86, x64) 버전의 SQLite를 기본 설치하면 설명 된 동작이 나타납니다. .NET 런타임이 컴퓨터에서 응용 프로그램을 실행하도록 선택한 실제 아키텍처에 맞는 올바른 버전을로드하려면 다음과 같이 DLL 로더에 올바른 라이브러리를 찾을 수있는 위치에 대한 힌트를 제공 할 수 있습니다.

Program.Main () 전에 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));

4

오래된 게시물이더라도 여기에서 찾은 솔루션을 공유하고 싶습니다 .http : //system.data.sqlite.org/index.html/info/54e52d4c6f

모든 문제를 읽지 않으려면 해결 방법은 SQLite.Interop.dll과 동일한 경로에 "msvcr100.dll"파일 (Windows \ System32 디렉터리에 있음)을 복사하는 것입니다.

이유를 이해하고 설정에 파일을 포함 시키지만 오류가 발생한 경우에만 설치하려면 문제를 읽고 설정 옵션에서 선택 가능한 구성 요소로 만들었습니다.

HTH, 포르 멘츠


이것에 대해 너무 감사합니다, 나는 다른 모든 것을 시도했고 이것이 해결책이었습니다
David Benko

4

SQLite 위키에서 알 수 있듯이 응용 프로그램 배포는 다음과 같아야합니다.

응용 프로그램 배포

따라서 규칙을 따라야합니다. 대상 플랫폼과 일치하는 dll을 찾아 그림에 설명 된 위치에 배치하십시오. DLL은 YourSolution / packages / System.Data.SQLite.Core. % version % /에서 찾을 수 있습니다.

응용 프로그램 배포에 문제가 있었으므로 프로젝트에 올바른 SQLite.Interop.dll을 추가하고 설치 프로젝트의 AppplicationFolder에 x86 폴더를 추가하고 dll에 파일 참조를 추가했습니다.


3

64 비트 프로젝트에서 32 비트 dll을 실행하려고하면이 오류가 발생할 수도 있습니다.

x86 및 x64 폴더 모두에 동일한 파일 (32 비트 버전의 SQLite.Interop.dll)을 배치했을 때 이것을 얻었습니다.



3

왜 이것이 포함되지 않았는지 모르겠지만 연구를 수행하고 직접 찾아야했기 때문에 누군가 가이 답변을 찾아 문제를 해결할 수 있기를 바랍니다. 이것은 WPF 앱을위한 것입니다. 내 Dev 상자에서 제대로 작동했지만 복사 한 컴퓨터에서 작동하지 않아 Unable to load DLL 'SQLite.Interop.dll'오류가 발생했습니다. OP와 같은 오류가 발생했을 때 "Debug"폴더에서 다른 컴퓨터로 직접 연결된 모든 디렉토리와 파일을 포팅했습니다. 내 DLL이 포함 된 "bin"폴더가 "Debug \ bin"으로 복사되었으며이 경로를 사용하여 다른 컴퓨터로 복사 할 때 응용 프로그램 파일과 함께 모든 파일이 포함되어 있으므로 파일이 누락되지 않았습니다.

내가 본 것들은 적용되지 않은 다른 답변에서 말했다 :

  • NuGet 패키지를 사용하지 않았거나 NuGet 패키지가 생성 한 것처럼 보이는 x86 또는 x64 폴더를 만들어야합니다. 내 DLL (System.Data.SQLite 및 SQLite.Interop.dll 및 System.Data.SQLite.config)은 내 프로젝트의 "bin"폴더에 있으며 수동으로 복사되었습니다 (솔루션 탐색기에서 "bin"폴더 만들기). VS, Windows 탐색기에서 DLL 을이 폴더에 붙여 넣으려면 추가> 기존 항목을 사용하여 파일을 VS 폴더 / 프로젝트로 가져 오십시오). 그런 다음 해당 위치를 사용하여 프로젝트에서 참조 된 어셈블리로 참조합니다 ( "참조"> "참조 추가", 찾아서 헹구고 나머지는 반복 ). 이것은 내 프로젝트가 어디에 있는지 정확히 알 수있게합니다.
  • 내 app.config에서 SQLite DLL 파일을 참조하거나 MyProject.csproj 파일을 터치 할 필요가 없었습니다.
  • 특정 프로세서를 지정할 필요조차 없었습니다! 혼합 또는 64 비트 DLL 만 있고 64 비트 OS 인 Windows 7 이상에서만 실행되지만 프로젝트의 빌드는 "모든 CPU"를위한 것입니다. (x86 전용 / 32 비트 전용 DLL 없음)
  • OP의 오류가 발생했을 때 이러한 DLL에 대해 "콘텐츠"및 "최신 경우 복사"로 이미 지정했습니다.

내가 찾은 것은 https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20입니다. .

(11) 응용 프로그램을 실행하려고 할 때 왜 DllNotFoundException ( "sqlite3.dll"또는 "SQLite.Interop.dll")이 발생합니까?

명명 된 동적 링크 라이브러리 (DLL)를 찾을 수 없거나 종속성이 없어서로드 할 수 없습니다. 이름 지정된 동적 링크 라이브러리가 응용 프로그램 디렉토리 또는 시스템 PATH의 디렉토리에 있는지 확인한 후 다시 시도하십시오.또한 정적으로 링크 된 동적 링크 라이브러리를 사용하지 않는 한 필요한 Visual C ++ 런타임 재배포 가능 패키지가 설치되어 있는지 확인하십시오 .

단락 안에 굵게 표시된 부분에 중점을 둡니다. 대상 컴퓨터가 최신 상태였으며 .NET 4.0 이외의 프로그램은로드되지 않았습니다. C ++을 설치하면 SQLite에 대한 명령을 완료 할 수있었습니다. 이것은 첫 번째 FAQ 중 하나였으며 전제 조건의 일부 였지만 # 11에 묻혔습니다. 내 개발 컴퓨터에는 Visual Studio가 포함되어 있기 때문에 이미로드되어 있으므로 작동했습니다.

다운로드 :
Visual Studio 2015 용 Visual C ++ 재배포 가능 패키지 :
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에서 Costura Fody를 설치하십시오.

  2. C # 프로젝트에서 costrua32라는 폴더를 만듭니다. 거기에 C #을로드 할 네이티브 dll을 추가하십시오.

  3. 이 폴더에 추가하면 속성 창을 클릭하고 빌드 조치를 "내장 자원"으로 변경하십시오.

  4. 마지막으로 FodyWeavers.xml이라는 XML 파일을 다음과 같이 수정해야합니다. 여기에서는 먼저 SQL dll을로드하도록 지정하고 있습니다. (.dll을 삭제하십시오.)

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

이것의 장점은 사전 또는 사후 빌드 이벤트를 작성할 필요가없고 최종 제품이 하나의 큰 파일로 완전히 캡슐화된다는 것입니다.



3

또한 Nuget Manager를 통해 테스트 프로젝트에 dll을 추가하고 수정했습니다.


2

Visual C ++ 2010 재배포 가능 패키지가 PC에 설치되어 있지 않기 때문에이 문제가 발생했습니다 .Visual c ++ 2010 재배포 가능 패키지를 아직 설치하지 않은 경우 다운로드 하여 설치하십시오 (x86 또는 64 dll 확인).


예. 이것은 저의 경우이기도합니다 ... Visual C ++ 2010 재배포 가능 SP1이 필요한 것은 나뿐입니다. 가장 좋은 방법은 사용중인 버전에 필요한 런타임을주의해서 읽는 것입니다. 여기 예를 들어 : system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Velja Radenkovic


2

나는 같은 문제를 겪었다. 그러나 마지막으로 해결할 수 있습니다. 현재 Visual Studio 2013 Community Edition을 사용하고 있습니다. 방금 추가- > 기존 항목 ...을 사용 하고 SQLite.Data.SQLite 파일이있는 위치를 찾습니다 (내 경우는 'C : \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin'). 어셈블리 파일 (* .dll; * .pdb)에 포함 할 내용의 유형을 변경하는 것을 잊지 마십시오 . 해당 폴더에서 ' SQLite.Interop.dll '을 선택하십시오 . 그때부터 나는 아무런 문제없이 계속할 수 있습니다. 모두에게 행운을 빕니다. ^ _ ^ PS 웹 양식 응용 프로그램을 만듭니다. 아직 창 형식 응용 프로그램이나 다른 응용 프로그램에서 시도하지 않았습니다.


2

Visual Studio에서 프로젝트-> 속성-> 빌드-> 플랫폼 대상을 빌드하기 전에 플랫폼 대상을 CPU가 아닌 x86 또는 x64로 설정하십시오.


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을 복사하면 dll에 대한 액세스 거부가 발생했습니다
AlexanderD

이 파일을 추가하면 문제가 해결되었지만 이것은 임시 해결책입니다.
Kartik Goyal

2

나는 오랫동안 이것으로 어려움을 겪었고 때로는 테스트 설정이 잘못되었다는 것을 알았습니다. 이 이미지를보십시오 : 테스트 설정

테스트 설정을 선택 해제하면 문제가 사라집니다. 그렇지 않으면 예외가 발생합니다. 바라건대, 이것은 누군가를 도울 것입니다. 그것이 근본 원인인지 확실하지 않습니다.


1
이 링크가 질문에 대답 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다. - 리뷰에서
Robert Columbia

필자의 경우 테스트 설정 파일이 잘못되었습니다 : <TestSettings ... <Deployment> <DeploymentItem filename = "bin \ Relase \ a.test.dll". 파일 위치가 잘못 구성되었습니다.
Tony Sun

2

x86 및 x64의 "SQLite.Interop.dll"파일을 디버그 폴더에 복사하십시오. 이러한 파일은 디버그 폴더의 "x86"및 "x64 폴더에 복사해야합니다.


2

내 응용 프로그램은 웹 응용 프로그램 (ASP.NET MVC)이며 LocalSystem대신 대신 실행되도록 응용 프로그램 풀을 변경해야했습니다 ApplicationPoolIdentity. 이것을하기 위해:

  1. IIS 관리자 열기
  2. 사이트가 실행중인 응용 프로그램 풀을 찾으십시오.
  3. 조치에서 고급 설정을 클릭하십시오.
  4. 신원 변경 LocalSystem

왜 이것이 문제를 해결하는지 모르겠습니다.


1

좋은 대답인지는 모르겠지만 "로컬 시스템"이라는 ID로 AppDomain에서 응용 프로그램을 실행하여이 문제를 해결할 수있었습니다.


1

SQLite 데이터베이스에 테스트 데이터를 추가하기 위해 간단한 콘솔 응용 프로그램을 작성 중이며이 오류가 발생했습니다. 프로젝트의 구성은 "모든 CPU"입니다. SQLite.Interop.dll을 bin \ debug 폴더로 복사하여 수정했습니다. 더 나은 방법은 @Wil의 방법을 사용하는 것이지만 "Any CPU"구성에이 방법을 어떻게 지정합니까?


1

어셈블리에 대한 경합이있을 수 있습니까? DLL에 파일 잠금이있는 다른 응용 프로그램이 있는지 확인하십시오.

이것이 이유라면, 다음과 같은 도구를 사용하는 것이 쉬워야합니다 Sysinternal의 Process Explorer 하여 문제가있는 프로그램을 .

클레이


1

이 질문을 보는 사람을 위해 참조하십시오.

너겟 패키지를 사용하면 복사를 수행하는 빌드 규칙을 설치합니다. (System.Data.SQLite.Core.1.0.94.0 \ build-또는 설치 한 Core 버전 참조).

너겟 설치 프로그램은 프로젝트 파일에 규칙을 자동으로 추가합니다.

그래도 테스트 사례 문제는 해결되지 않습니다. DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) 접근 방식이 유일하게 작동하는 것 같습니다.


1

WebAPI / MVC5 웹 프로젝트 및 기능 테스트 프로젝트가있는 솔루션 에서이 문제를 가로 질러 동일한 데이터 액세스 (또는 '핵심') 프로젝트에서 벗어났습니다. 나는 다른 많은 사람들처럼 Visual Studio 2013에서 NuGet을 통해 다운로드 한 사본을 사용하고 있습니다.

내가 한 것은 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.