문제

최근 AC# Windows 서비스를 업그레이드하여 64 비트 .NET 프로세스로 실행했습니다. 일반적으로 이것은 사소한 일이지만 시스템은 C ++로 작성된 32 비트 DLL을 사용합니다. 이 DLL을 64 비트로 변환하는 옵션이 아니므로 DLL을 별도의 32 비트 .NET 프로세스로 감고 원격을 통해 .NET 인터페이스를 노출했습니다.

이것은 매우 신뢰할 수있는 솔루션이지만 시스템을 단일 프로세스로 실행하는 것을 선호합니다. 32 비트 DLL을 64 비트 프로세스에로드하여 직접 액세스 할 수있는 방법이 있습니까 (아마도 일종의 펑크 레이어를 통해)?

도움이 되었습니까?

해결책

아니, 당신은 할 수 없습니다.

16 비트 및 32 비트 창은 모두 32 비트 선형 주소 공간에 살았습니다. 용어 16 및 32는 선택기에 대한 오프셋의 크기를 나타냅니다.

...

먼저, 풀 사이즈 16 비트 포인터와 32 비트 플랫 포인터의 크기가 동일합니다. 값 0x0123 : 0x467에는 32 비트가 필요하며 와우도 32 비트 포인터도 필요합니다. 이는 포인터를 포함하는 데이터 구조가 16 비트와 32 비트에 대한 크기를 변경하지 않음을 의미합니다. 매우 편리한 우연의 일치.

이 두 가지 관찰 중 어느 것도 32 비트에서 64 비트 싱킹에 적용되지 않습니다. 포인터의 크기가 바뀌 었습니다. 즉, 32 비트 구조를 64 비트 구조로 변환하고 그 반대로 구조의 크기가 변경됩니다.. 64 비트 주소 공간은 32 비트 주소 공간보다 40 억 배 더 큽니다. 오프셋 0x000006FB`01234567의 64 비트 주소 공간에 메모리가 있으면 32 비트 코드에 액세스 할 수 없습니다. 32 비트 플랫 코드는 이러한 임시 주소 창에 대해 알지 못하기 때문에 임시 주소 창을 만들 수있는 것과는 다릅니다. 그들은 셀렉터를 버렸습니다. 기억하십니까?

http://blogs.msdn.com/oldnewthing/archive/2008/10/20/9006720.aspx

다른 팁

.NET 응용 프로그램이 IIS에서 실행되는 웹 사이트 인 경우 우회 할 수 있습니다.

64 비트 머신에서 IIS에서 실행되는 ASP.NET 웹 페이지는 64 비트 버전의 W3WP.EXE 프로세스로 호스팅되며 웹 페이지에서 32 비트 DLL을 사용하면 사이트가 실패합니다.

그러나 IIS에서는 사이트를 실행하는 응용 프로그램 풀의 고급 설정으로 이동하여 "32 비트 응용 프로그램 활성화"를 true로 변경할 수 있습니다.

따라서 여전히 64 비트 프로세스 내에서 32 비트 DLL을 실행할 수는 없지만 대신 W3wp.exe를 대신 32 비트 프로세스로 실행하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top