Compilar proyecto con referencias de 32 y 64 bits en Visual Studio

32-64-bitsVisual Studio nos permite compilar en 32 y 64 bits un proyecto indistintamente, sin embargo no permite indicar la ruta donde las referencias de librerías (dll) de terceros deben cargarse en cada caso, por tanto, cuando se selecciona la arquitectura de la plataforma destino a compilar, siempre buscará la referencia en la ruta indicada para la primera plataforma.

Pongamos un ejemplo que muestre más claramente lo que quiero decir:

Tenemos una librería de terceros llamada "Func.dll", de la cual tenemos una versión en 32 y otra en 64 bits en diferentes carpetas.

 

 

Creamos un proyecto .NET que va a consumir dicha librería y por vicisitudes de la vida, necesitamos una versión final en 64 bits y otra en 32 bits, puesto que los servidores destino pueden ser de cualquier arquitectura, dependiendo del usuario final y su hardware.

En tal caso referenciamos la librería Func.dll de 32 bits en nuestro proyecto, por el momento apuntando a 32 bits, lo compilamos y todo va genial, pero si lo apuntamos a 64 bits, la referencia a Func.dll sigue apuntando a la ruta de 32 bits de Func.dll, lo cual supone un warning de compilación y seguramente que no funcione ni en nuestro ordenador ni en el servidor destino.

Visual Studio no incorpora nada para solucionar este problema, o yo al menos desconozco si lo tiene, en cuyo caso cualquier comentario de ayuda será mas que bienvenido.

En todo caso, solucionarlo es sencillo editando el archivo de proyecto y poniendo condicionales según la arquitectura de la plataforma.

1) Editamos archivo "nombre.csproj" (en caso de un proyecto en CSharp)

2) Metemos clausulas condicionales para la referencia, en nuestro caso la librería imaginaria llamada "Func.dll", en otros casos y como es lógico habrá que cambiar el nombre de la referencia, de la librería física y de su ruta:

        <ItemGroup Condition=" '$(Platform)' == 'x86' ">
          <Reference Include="Func">
            <HintPath>..lib32Func.dll</HintPath>
          </Reference>
        </ItemGroup>
        <ItemGroup Condition=" '$(Platform)' == 'x64' ">
          <Reference Include="Func">
            <HintPath>..lib64Func.dll</HintPath>
          </Reference>
        </ItemGroup>

De esta manera, cuando se cambie la plataforma destino para compilar, Visual Studio sabrá que librería debe incluir según sea x86 o x64 y habremos solucionado el problema.

 

4852 visitas.

3 comentarios sobre “Compilar proyecto con referencias de 32 y 64 bits en Visual Studio

  1. Oye genial. andube buscando esta solucion por algun tiempo, ya que lo que yo tube que hacer es agregar y quitar referencias cada que compilaba para una u otra plataforma.. y con esta solución deberia de ser mucho más facil..

     

    Saludos..

  2. Bueno, yo tengo una duda y no encuentro en la red quien explique de forma precisa lo que sucedería.

    Sé que en un SO de 64 bits:
    – Un programa compilado en x86 corre a 32 bits (con los archivos en la carpeta WOW64).
    – Un programa compilado en x64 corre a 64 bits (con los archivos en la carpeta System32).

    La duda es, en el proyecto se agrega una referencia a una dll que está compilada a x86 (32 bits, y solo existe a 32 bits), pero el proyecto se sigue compilando a x64 (64 bits), finalmente el programa corre a 64 o 32 bits???

  3. Hola, he seguido al pie de la letra tus instrucciones, situé las librerías (32 y 64) en carpetas distintas, modifique el csproj, pero no funciona (No reconoce Condition=”$(Platform)==’x86′” o x64).
    Creí que el problema podría esta en la ruta del ensamblado puesto que el Reference Path estaba apuntando a la carpeta bin, y deje la ruta que tenia en el cspoj y nada.. 🙁

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *