2011-08-05 6 views
0

AnyCPU를 사용하여 작성된 ADO.NET 데이터 공급자를 만들었습니다. 직접 참조하면 64 비트 및 32 비트 Windows OS에서 잘 작동합니다. 그러나 설치 프로그램에서 DbProviderFactory를 .NET machine.config에 등록하고 GAC에 내 어셈블리를 배치하여 사용자가 System.Windows.DbProviderFactories를 통해 데이터 공급자에 액세스 할 수 있도록합니다. 이것은 응용 프로그램이 32 비트로 실행되는 한 훌륭하게 작동합니다. x64 용 응용 프로그램에서는 작동하지 않습니다.32 비트 및 64 비트 .NET machine.config를 수정하기 위해 32 비트 설치 프로그램을 시작하는 동안 64 비트 프로세스를 시작하십시오.

이것은 내가 발견 한 것입니다. 내 설치 프로그램은 32 비트를 대상으로합니다. 따라서 내 DbProviderFactory는 32 비트 .NET machine.config에만 추가됩니다. x64 응용 프로그램이 DbProviderFactories를 통해 내 데이터 공급자를 사용하려면 64 비트 .NET machine.config에 등록해야합니다.

두 명의 설치 관리자가 있어야합니까? 하나는 32 개를, 다른 하나는 64 개를 타겟팅합니까? 모든 어셈블리는 AnyCPU입니다 (사용자 응용 프로그램이 어떤 플랫폼인지 알지 못하기 때문에).

다소 복잡한 해결책이있었습니다. 설치 프로그램을 실행하는 동안 OS가 64 비트 (here)인지 확인하는 사용자 지정 작업이 있습니다. 그렇다면 machine.config (64 비트)에 DbProviderFactory를 추가 할 64 비트 콘솔 앱을 실행하는 프로세스를 시작하고 싶습니다. 그리고 설치 프로그램 자체는 32 비트 machine.config에 등록됩니다. 나는 32 비트를 대상으로하는 설치 프로젝트에서 64 비트 어셈블리를 가질 수 없으므로 시도했지만 실패했습니다. 그러나 64 비트 OS에서 64 비트 프로세스로 실행되는 것으로 가정하면 AnyCPU를 사용하여 콘솔 응용 프로그램을 빌드하려고 시도합니다.

이것은 다소 번거롭지만, 으로 생각합니다. 왜 이것이 나쁜 생각입니까? MS는 "32 비트 및 64 비트 플랫폼에 .NET Framework 응용 프로그램을 배포하고 32 비트 및 64 비트 컴퓨터를 대상으로하는 2 개의 MSI 패키지를 구축해야한다"(msdn). 기술적으로 모든 어셈블리가 AnyCPU이므로 작동합니까?

또한, 나는 내 자신의 질문에 대답하기 위해 .NET 3.5

+0

32 비트 msi 설치 프로그램이 32 비트 프로세스로 실행되기 때문에 제대로 작동하는지 확신 할 수 없습니다. AnyCPU dll은 32 비트 (32 비트 프로세스 내에서 실행되는 AnyCPU dll)로 실행되어야합니다. 따라서 64 비트 및 32 비트 MSI 설치 프로그램이 있어야합니다. –

+0

32 비트 msi 설치 프로그램이 AnyCPU 콘솔 응용 프로그램 (exe)을 실행하는 _new_ 프로세스를 시작하도록하고 싶지만 64 비트 OS에서만 가능합니다. 이론 상으로는이 새로운 프로세스는 64 비트로 실행되어야하며 64 비트 machine.config에 액세스해야합니다. – codyzu

+0

MSI는 많이 의존합니다.어쩌면 어느 날 32 비트 운영체제를 더 이상 설치하지 않는 사람이 어느 정도 시간이 걸릴 것입니다. 두 번의 설치를 실행하는 것은 매우 낮은 통증 솔루션입니다. 어쨌든 너에게. –

답변

1

을 사용하고 있습니다 :

1) 내가 32 비트 및 64 비트 설치가 필요하지 않습니다. 그러나 이것은 모든 어셈블리가 AnyCPU이기 때문에 유일한 경우입니다.

2) 클라이언트에 하나의 설치 프로그램 만 배포하면되기 때문에 좋은 생각이 아닙니다. 64 비트 시스템의 추가 설치 작업을 마술처럼 수행하기 때문에 좋은 생각입니다.

3) 어셈블리 또는 포함 된 참조가 32 비트 또는 64 비트 용으로 명시 적으로 빌드 된 경우 M $가 설치 프로그램을 모두 갖고 있다고 말합니다.

최종 해결 방법 : 내 32 비트 설치 관리자에서 machine.config에 어셈블리를 등록합니다. 그런 다음 운영 체제가 64 비트인지 (내 질문에 제공된 링크를 사용하여) 확인합니다. 그렇다면 AnyCPU 용으로 별도의 프로세스로 빌드 된 명령 줄 유틸리티 (설치 관리자에 포함되어 있음)를 시작합니다. 이 유틸리티는 내 어셈블리를 64 비트 machine.config에 등록합니다. AnyCPU 유틸리티는 64 비트 OS에서 새 프로세스로 시작되기 때문에 64 비트 프로세스로 기본 설정됩니다. 끝난.

관련 문제