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:
- Usar ensamblajes paralelos para cargar la versión x64 o x32 de una DLL
- http://blogs.msdn.com/b/gauravseth/archive/2006/03/07/545104.aspx
- http://www.thescarms.com/dotnet/Assembly.aspx
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/