예, 동일한 프로젝트에서 동일한 코드 기반으로 x86 및 x64를 모두 대상으로 지정할 수 있습니다. 일반적으로 VS.NET에서 올바른 솔루션 구성을 만들면 문제가 해결됩니다 (비 관리 DLL에 대한 P / Invoke에는 대부분 조건부 코드가 필요할 가능성이 높음). 특별한주의가 필요한 항목은 다음과 같습니다.
- 이름은 같지만 고유 한 비트를 가진 외부 관리 어셈블리에 대한 참조 (COM interop 어셈블리에도 적용됨)
- MSI 패키지 (이미 언급했듯이 x86 또는 x64를 대상으로해야 함)
- MSI 패키지의 모든 사용자 지정 .NET 설치 관리자 클래스 기반 작업
어셈블리 참조 문제는 지정된 이름의 참조를 프로젝트에 한 번만 추가 할 수 있으므로 VS.NET 내에서 완전히 해결할 수 없습니다. 이 문제를 해결하려면 프로젝트 파일을 수동으로 편집하십시오 (VS에서 솔루션 탐색기에서 프로젝트 파일을 마우스 오른쪽 단추로 클릭하고 프로젝트 언로드를 선택한 다음 다시 마우스 오른쪽 단추를 클릭하고 편집을 선택하십시오). x86 버전의 어셈블리에 대한 참조를 추가하면 프로젝트 파일에 다음과 같은 내용이 포함됩니다.
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
적용되는 솔루션 구성을 나타내는 ItemGroup 태그 안에 Reference 태그를 래핑합니다. 예 :
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
그런 다음 전체 ItemGroup 태그를 복사하여 붙여넣고 64 비트 DLL의 세부 정보를 포함하도록 편집합니다. 예 :
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
VS.NET에서 프로젝트를 다시로드 한 후 어셈블리 참조 대화 상자가 이러한 변경 사항으로 인해 약간 혼란스럽고 잘못된 대상 프로세서가있는 어셈블리에 대한 경고가 발생할 수 있지만 모든 빌드는 정상적으로 작동합니다.
MSI 문제를 해결하는 것은 다음 단계이며, 안타깝게도 비 VS.NET 도구 가 필요합니다. 저는 Caphyon의 고급 설치 프로그램 이 관련된 기본 트릭을 끌어 내기 때문에 해당 목적을 위해 선호합니다 (일반 MSI 및 32 비트 생성 그리고 64 비트 특정 MSI를 사용하고 .EXE 설치 실행기를 사용하여 올바른 버전을 추출하고 런타임에 필요한 수정을 수행합니다.)
다른 도구 나 Windows Installer XML (WiX) 도구 집합을 사용하여 동일한 결과를 얻을 수 있지만 고급 설치 프로그램을 사용하면 작업이 너무 쉬워지고 비용도 저렴하여 실제로 대안을 살펴본 적이 없습니다.
고급 설치 프로그램을 사용하는 경우에도 여전히 WiX가 필요할 수있는 한 가지는 .NET 설치 프로그램 클래스 사용자 지정 작업입니다. 특정 플랫폼에서만 실행되어야하는 특정 작업 (각각 VersionNT64 및 NOT VersionNT64 실행 조건 사용)을 지정하는 것은 간단하지만 기본 제공 AI 사용자 지정 작업은 64 비트 컴퓨터에서도 32 비트 프레임 워크를 사용하여 실행됩니다. .
이 문제는 향후 릴리스에서 수정 될 수 있지만 현재 (또는 다른 도구를 사용하여 동일한 문제가있는 MSI를 만드는 경우) WiX 3.0의 관리되는 사용자 지정 작업 지원을 사용하여 적절한 비트로 작업 DLL을 만들 수 있습니다. 해당 프레임 워크를 사용하여 실행됩니다.
편집 : 버전 8.1.2부터 고급 설치 프로그램은 64 비트 사용자 지정 작업을 올바르게 지원합니다. 내 원래 대답 이후로, 불행히도 InstallShield 및 ilk와 비교할 때 여전히 매우 좋은 가치이지만 가격이 상당히 상승했습니다 ...
편집 : DLL이 GAC에 등록 된 경우 다음과 같이 표준 참조 태그를 사용할 수도 있습니다 (예 : SQLite).
<ItemGroup Condition="'$(Platform)' == 'x86'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
</ItemGroup>
조건은 또한 모든 빌드 유형, 릴리스 또는 디버그로 축소되며 프로세서 아키텍처 만 지정합니다.