2008-10-22 7 views
33

최근에 C# Windows 서비스를 64 비트 .net 프로세스로 업그레이드했습니다. 일반적으로 이것은 간단하지만 C++로 작성된 32 비트 DLL을 사용합니다. 이 DLL을 64 비트로 변환하는 옵션이 아니므로 별도의 32 비트 .net 프로세스로 DLL을 래핑하고 리모팅을 통해 .net 인터페이스를 노출했습니다.Windows에서 32 비트 DLL을 64 비트 프로세스로로드 할 수 있습니까?

이것은 상당히 신뢰할만한 솔루션이지만 시스템을 단일 프로세스로 실행하는 것이 좋습니다. 내 32 비트 DLL을 64 비트 프로세스에로드하고 직접 액세스 할 수있는 방법이 있습니까 (아마 일종의 썽킹 레이어를 통해)?

답변

25

아니요, 불가능합니다.

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

...

먼저, 전체 크기의 16 비트 포인터와 32 비트 포인터 평면 크기가 동일한 것을 알. 0x: 0x467 값은 32 비트를 필요로하며 와우도 32 비트 포인터를 사용합니다. 이것은 포인터를 포함하는 데이터 구조가 16 비트와 32 비트 사이의 크기를 변경하지 않는다는 것을 의미합니다. 아주 편리한 우연의 일치.

32 비트에서 64 비트 튠크에 대해 위의 두 가지 관찰 결과가 적용되지 않습니다. 포인터의 크기가 변경되었습니다. 즉, 32 비트 구조를 64 비트 구조로 또는 그 반대로 변환하면 구조체의 크기가 변경됩니다 (). 그리고 64 비트 주소 공간은 32 비트 주소 공간보다 40 억 배 더 큽니다. 64 비트 주소 공간에 0x000006fb`오프셋의 일부 메모리가 있으면 32 비트 코드에서이 메모리에 액세스 할 수 없습니다. 32 비트 플랫 코드는 이러한 임시 주소 창에 대해 알지 못하기 때문에 임시 주소 창을 작성할 수있는 것과는 다릅니다. 그들은 선택자들을 버렸어, 기억하지?

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

6

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

64 비트 컴퓨터의 IIS에서 실행되는 ASP.NET 웹 페이지는 64 비트 버전의 w3wp.exe 프로세스에 의해 호스팅되며 웹 페이지가 32 비트 DLL을 사용하는 경우 사이트가 실패합니다.

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

64 비트 프로세스에서 32 비트 dll을 실행할 수 없지만 대신 w3wp.exe를 32 비트 프로세스로 실행합니다.

+4

이 질문은 프로세스가 ASP.NET 웹 사이트가 아니라 Windows 서비스임을 설명합니다. 또한 설명하는 IIS 설정은 질문에서 피하려고하는 것과 동일한 솔루션을 효과적으로 구현합니다. –

관련 문제