주기적으로 다음과 같은 예외가 발생합니다.
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
. 다음 단계에 따라 수정했습니다.
- Visual Studio에서 프로젝트 디자이너를 엽니 다. 방법에 대한 자세한 내용은 여기를 참조하십시오. .
- 빌드 탭을 클릭하십시오.
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을 실행하는 것과 동일한 문제가 발생했습니다. 여기 및 다른 곳에서 언급하지 않은 여러 가지 솔루션을 사용해 보았습니다. 이 수정 프로그램이 다른 사람에게 도움이되기를 바랍니다.
속성 을 사용하여 수정했습니다.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”폴더 내의 디렉토리로 합니다.
모두 녹색입니다. 모두 좋은.