Pergunta

Eu recentemente atualizado um serviço # windows c para ser executado como um processo de .net de 64 bits. Normalmente, este seria trivial, mas o sistema faz uso de uma DLL 32 bits escritos em C ++. Ele não é uma opção para converter essa DLL a 64 bits, de modo que o DLL envolvido num processo .NET 32 bits separada e exposta através de uma interface de comunicação remota .NET.

Esta é uma solução bastante confiável, mas eu preferiria para executar o sistema como um único processo. Existe alguma maneira eu posso carregar meu DLL de 32 bits em um processo de 64 bits e acessá-lo diretamente (talvez através de algum tipo de thunking camada)?

Foi útil?

Solução

Não, você não pode.

Ambos 16-bit e 32-bit Windows vivia em um 32-bit linear espaço de endereço. Os termos 16 e 32 referem-se ao tamanho do deslocamento em relação ao selector.

...

Primeiro, aviso de que um ponteiro 16 bits de tamanho completo e um ponteiro plana de 32 bits são do mesmo tamanho. O valor 0x0123: 0x467 requer 32 bits, e wow, o mesmo acontece com um ponteiro de 32 bits. Isto significa que as estruturas de dados que contêm ponteiros não mudam de tamanho entre os seus homólogos de 16 bits e de 32 bits. Uma coincidência muito útil.

Nenhuma destas duas observações vale para 32-bit e 64-bit thunking. O tamanho do ponteiro mudou, o que significa que a conversão de uma estrutura de 32-bit para uma estrutura de 64 bits, e vice-versa, altera o tamanho da estrutura . E o espaço de endereço de 64 bits é de quatro bilhões de vezes maior do que o espaço de endereçamento de 32 bits. Se houver alguma memória no espaço de endereço de 64 bits no código 0x000006fb`01234567, 32-bit deslocamento não será capaz de acessá-lo. Não é como você pode construir uma janela de endereço temporário, porque o código simples de 32 bits não sabe sobre essas janelas endereço temporário; eles abandonaram seletores, lembra?

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

Outras dicas

Se o seu aplicativo .NET é um site em execução no IIS você pode contorná-la.

webpage Um ASP.NET em execução no IIS em uma máquina de 64 bits será apresentado por uma versão do processo w3wp.exe 64-bit, e se sua página usa 32-bit dlls seu site irá falhar.

No entanto, em IIS, você pode ir para as Configurações avançadas do pool de aplicativos em execução no site, e mudança "Ativar aplicativos de 32 bits" para true.

Por isso, ainda não é capaz de executar dll de 32 bits dentro de processo de 64 bits, mas ele está sendo executado w3wp.exe como um processo de 32 bits em vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top