[C#] DLL ‘SQLite.Interop.dll’을로드 할 수 없습니다

주기적으로 다음과 같은 예외가 발생합니다.

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이로드됩니다. 그것은 며칠 동안 작동 할 수 있지만 다시 깨질 수 있습니다.

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



답변

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

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

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


답변

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

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


답변

플랫폼 대상이 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>


답변

이것이 내가 프로젝트에서 수정 한 방법입니다.

작동 중이었고 동료가 변경 사항을 제출했을 때 “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) 폴더에 덤프되었습니다.


답변

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

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

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


답변

이 상태가되면 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 디렉토리로 강제 복사했습니다.

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


답변

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”폴더 내의 디렉토리로 합니다.

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