c# c c++-cli 64-bit x86

c# - Cualquier CPU dependiente de C++/CLI dependiente de C dll nativo(cualquier cpu para c++/cli)



c++-cli 64-bit (1)

Aquí está mi problema. Estoy envolviendo un dll C en C #. Para hacer esto, primero estoy escribiendo un contenedor C ++ / CLI. La biblioteca C nativa está vinculada al contenedor C ++ / CLI. (Propiedades del enlazador en proyecto C ++ / cli).

Así es como está todo organizado ahora: - El C .lib nativo: tanto x86 como 64bit.

  • 1 solución que contiene 2 proyectos:
    • Proyecto contenedor de C ++ / CLI al que está vinculado C .lib nativo
    • Proyecto C # referenciando proyecto C ++ / CLI

Mi problema proviene del hecho de que necesito C # para apuntar a "Cualquier CPU". Pero esta opción no está disponible en C ++ / CLI ya que se compila directamente en código nativo.

Mi idea para resolver esto es: - Compile C ++ / CLI wrapper en x86 y luego cambie la configuración y compile a 64 bits. Cuando se compile, me gustaría decirle qué dll tomar en función de la plataforma. es decir: si compilo en 64 bits, vincule 64 dll nativos de C, o si x86, vincule x86 nativo C. - Una vez hecho esto, debería poder tener cualquier objetivo de CPU en mi plataforma C #. De nuevo, en lugar de hacer referencia a mi proyecto de contenedor de C ++ / CLI, me referiría a la dll requerida en función de la plataforma de destino.

Mis preguntas son:

  • ¿Cómo le digo al proyecto C ++ / CLI a qué .lib se debe vincular en función de la plataforma de destino?
  • ¿Cómo le digo al proyecto C # a qué dll de C ++ / CLI debe hacer referencia en función de la plataforma de destino?

Permítame agregar que el C # proyecta una BIBLIOTECA DE CLASE para ser utilizada por un cliente x86 o x64.

Espero que mi pregunta sea lo suficientemente clara. Cualquier ayuda sería apreciada!

ACTUALIZACIÓN basada en: Referencias condicionales en proyecto .NET, ¿es posible deshacerse de la advertencia? ...

Así que ahora he editado mi archivo .csproj usando una condición para hacer referencia a la dll de la siguiente manera:

<ItemGroup> <Reference Include="AlibCppWrapper, Version=1.0.4303.21410, Culture=neutral, PublicKeyToken=c0c17a53adc44091, processorArchitecture=AMD64" Condition="$(Platform) == ''x64''"> <SpecificVersion>False</SpecificVersion> <HintPath>../x64/Debug/AlibCppWrapper.dll</HintPath> </Reference> <Reference Include="AlibCppWrapper, Version=1.0.4303.21410, Culture=neutral, PublicKeyToken=c0c17a53adc44091, processorArchitecture=x86" Condition="$(Platform) == ''x86''"> <SpecificVersion>False</SpecificVersion> <HintPath>../Debug/AlibCppWrapper.dll</HintPath> </Reference> </ItemGroup>

Desafortunadamente, esto no funciona ya que $ (Plataforma) está configurado en AnyCPU ...


Lo que describe se conoce como "ensamblaje de lado a lado" (dos versiones del mismo ensamblaje, uno de 32 y otro de 64 bits) ... Creo que esto le resultará útil:

EDITAR - según el comentario:

Aquí puede encontrar un tutorial para exactamente su escenario (DLL de .NET con C ++ / CLI DLL que hace referencia a una DLL nativa) http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/