2010-12-09 7 views
6

Tenemos una DLL (un servidor COM) que se compilará bien en 32 bits y 64 bits, pero la DLL utiliza el mismo CLSID y AppID para la versión de 32 bits y la versión de 64 bits. ¿Está bien o tiene que cambiar esto?¿Cómo instalo las versiones de 32 bits y 64 bits de una DLL COM y "auto-select"?

Lo estoy preguntando porque aparentemente en una máquina de 64 bits, no podemos registrar la versión de 32 bits y la de 64 bits juntas. Sería bueno si las aplicaciones cliente de 32 bits pudieran usar automáticamente la DLL de 32 bits, y las aplicaciones cliente de 64 bits podrían usar automáticamente la DLL de 64 bits.

En una nota relacionada, tenemos el código fuente y el archivo de proyecto Visual Studio 2005 para una aplicación cliente ... ¿cómo compilamos una versión de 32 bits y de 64 bits de la misma aplicación? Es una aplicación de C#, e incluye una referencia a nuestro servidor DLL COM como esto:

<ItemGroup> <COMReference Include="ComServer">

<Guid>{C1FADEA6-68FD-4F43-9FC2-0BC451FA5D53}</Guid>

<VersionMajor>830</VersionMajor> <VersionMinor>0</VersionMinor>

<Lcid>0</Lcid> <WrapperTool>tlbimp</WrapperTool> <Isolated>False</Isolated>

</COMReference> </ItemGroup>

Si resulta que necesitamos un CLSID separado para 64 bits, ¿cómo hacemos esta referencia "solo para la configuración de 32 bits" en Visual Studio? ¿O tenemos que tener proyectos separados con el mismo código fuente: uno que se refiere a la DLL de 32 bits, y el otro que se refiere a la DLL de 64 bits?

Respuesta

13

Ambas versiones pueden (y de hecho deberían) usar los mismos GUID para todo.

En una máquina de 32 bits no puede registrar o utilizar la DLL de 64 bits, por lo que no hay ningún problema allí. La DLL de 64 bits simplemente no entra en la imagen.

En una máquina de 64 bits, la DLL de 64 bits se registra en HKLM/Software/Classes/CLSID (etc.) y la DLL de 32 bits se registra en HKLM/Software/Wow6432Node/Classes/CLSID. (Me pregunto de dónde sacaste el consejo de que no puedes registrar la DLL de 32 bits en una máquina de 64 bits ...) Un cliente de 32 bits que se ejecute en la máquina de 64 bits se verá en el lugar normal del registro , pero el sistema operativo lo redirigirá silenciosamente a la clave Wow6432Node.

+2

Olvidé decir ... en el equipo de 64 bits hay una versión de 32 bits de regsvr32.dll en \ Windows \ SysWow64 \ para registrar archivos DLL de 32 bits en el área Wow6432Node. (Tendrá que acostumbrarse al patrón de nomenclatura completamente contra-intuitivo.) Tuvimos un problema con nuestro instalador: en una máquina de 64 bits no usaría el regsvr32 de 32 bits.dll, pero necesitábamos instalar una DLL de 32 bits. Así que terminamos escribiendo nuestra propia versión y ejecutándola de forma explícita. –

+0

Al menos en Win7, regsvr32.exe es lo suficientemente inteligente como para llamar a la otra versión de sí mismo automáticamente si lo ejecuta contra el tipo opuesto de DLL. (Esto se aplica tanto a los archivos DLL de 32 bits como a los de 64 bits y a las versiones de regsvr32.exe). –

+0

@Leo: Gracias por la sugerencia. Había leído sobre eso, pero descubrí que no funcionaba para mí en Vista, así que pensé que era algo que había caído entre las grietas. Solo comencé a probar en Win7 después de terminar el instalador. –

7

Esto se trata dentro de Windows con una característica llamada 'Registry redirection' En la versión de 64 bits de Windows, un programa de 32 bits obtiene una vista diferente del registro. Cualquier acceso al alias HKCR o la raíz HKLM \ Software se redirige para el tipo de claves que usa un servidor COM. Un programa de 32 bits realmente ve los valores clave almacenados en HKLM \ Software \ Wow6432Node. Puede verlo con Regedit.exe

Esto generalmente es cuidado por un instalador, un proyecto de configuración VS tiene la propiedad TargetPlatform por ejemplo. Si desea que el servidor COM esté disponible tanto en el modo de 32 bits como en el de 64 bits, debe usar dos instaladores. O un instalador de 64 bits que escribe ambos conjuntos de claves. Tener un servidor COM que pueda manejar ambos es muy inusual en los viejos tiempos. Pero no es algo inaudito cuando lo implementó en .NET, por ejemplo.

Cuestiones relacionadas