2013-02-08 2 views
2

2 개의 프로젝트 .NET 4.5 C# 솔루션이 있는데 하나의 프로젝트 (projectA)는 5 개의 .dll (COM이 아닌) 파일이있는 클래스 라이브러리입니다. 이 파일은 32/64 비트로, include/x86/include/x64 /)와 각각의 .dll 파일을 포함하는 빌드 경로에 두 개의 include/folders가 있습니다. .dll의 이름은 32 비트와 64 비트 버전에서 동일합니다. 다른 프로젝트 (projectB)는 projectA를 참조하는 콘솔 앱입니다. 내가 Debug (또는 Release, 상관 없다) x64 모드를 구성하고 빌드하면 모든 것이 작동합니다. 모든 5 .dll을 bin/x64/디렉토리에 복사하면 프로그램이 예상대로 작동합니다. 그러나 구성을 x86 모드로 전환하고 빌드 할 때 다섯 개의 .dll 중 두 개만 bin/x86/디렉토리로 복사되고 프로그램이 작동하지 않습니다. FileNotFoundException을 throw하고 어셈블리가 bin/디렉토리에서 찾을 수 없어 어셈블리가로드되지 않는다고 불평합니다.어셈블리 복사본이 x64 구성에서 제대로 작동하지만 x86은 지원하지 않습니다.

누락 된 .dll 파일을 bin/x86/폴더로 직접 복사 (또는 빌드 후 이벤트에서 xcopy 사용)하면 프로그램이 작동합니다. 따라서 Visual Studio (2012 Update 1)와 관련하여 빌드하는 동안 파일을 제대로 복사하지 않는 것으로 보입니다. projectA의 5 개 참조는 모두 Copy : Local로 설정되고 Visual Studio의 Properties 상자에있는 경로는 x86 및 x64 모드에서 모두 올바릅니다. 모든 x86-64 모드에서 projectA 만 빌드하면 모든 .dll 파일이 올바른 bin/폴더로 올바르게 복사됩니다. 따라서이 문제는 projectB를 참조하는 프로젝트 A를 처리해야합니다. 문제에

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> 
    <PlatformTarget>x64</PlatformTarget> 
</PropertyGroup> 
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> 
    <PlatformTarget>x86</PlatformTarget> 
</PropertyGroup> 

<ItemGroup> 
<Reference Include="BaseCommon"> 
    <HintPath>include\$(Platform)\BaseCommon.dll</HintPath> 
</Reference> 
<Reference Include="BaseDataAccess"> 
    <HintPath>include\$(Platform)\BaseDataAccess.dll</HintPath> 
</Reference> 
<Reference Include="BaseError"> 
    <HintPath>include\$(Platform)\BaseError.dll</HintPath> 
</Reference> 
<Reference Include="BaseTof"> 
    <HintPath>include\$(Platform)\BaseTof.dll</HintPath> 
</Reference> 
<Reference Include="MassSpecDataReader"> 
    <HintPath>include\$(Platform)\MassSpecDataReader.dll</HintPath> 
</Reference> 
<Reference Include="System" /> 

어떤 아이디어 : 여기

는 projectA.csproj 파일에서 발췌 한 것입니다? 내가 xcopy 명령을 할 수 있다고 가정하지만 그것은 특히 x64 모드에서 올바르게 작동하는 경우에는 필요하지 않아야합니다.

3 개의 다른 컴퓨터에서 windows 8 및 windows 7 64 비트로 테스트되었습니다.

+0

로커에서 벗어 났을 수도 있지만 프로젝트 참조를 추가하면 해당 참조에서 필요한 바이너리를 가져와야합니다. –

+0

@ltn 그래, 나도 그렇게 생각 했어.하지만 작동하지 않는 것 같아. projectB는 projectA에서 Solution -> Project 참조를 사용하고 5 .dll 중 2 개를 bin/folder와 projectA.dll에 올바르게 복사합니다. 그러나 이상한 이유로 다른 3 개의 DLL에서 실패합니다. – Moop

답변

0

일부 .dll 파일의 버전이 잘못되었음을 알고 난 후이 문제를 해결했습니다. .dll에서 ildasm.exe를 사용하여 매니페스트를 열고 일부 .dll이 다른 .dll 파일의 잘못된 버전을 참조하고 있음을 알게되었습니다. 따라서 msbuild는 바이너리 파일의 복사본을 예상대로 수행하지 않았습니다. 누락 된 .dll 파일을 수동으로 복사 할 때 코드가 작동하는 이유는 API가 두 버전간에 변경되지 않았기 때문입니다.

관련 문제