Resumen/pregunta básica: necesito hacer referencia a un archivo binario (dll) creado por otra persona en C a partir de un proyecto de aplicación universal Win 10. Sin embargo, hay una dll separada para x86 y arm. Creo que necesito hacer referencia al dll (o al menos al archivo winmd) del proyecto para que se implemente, pero solo puedo hacer referencia a un archivo, no a ambos. Eso significa que la aplicación falla en una plataforma u otra (escritorio o teléfono) porque tiene incluido el binario incorrecto. Buscando una solución.
Explicación más detallada;
Estoy tratando de escribir una aplicación universal de Windows (nuevo estilo de Windows 10). Esto significa que tengo un solo proyecto para agregar referencias a componentes externos.
Tengo la necesidad de algunas cosas de procesamiento de imágenes que es mejor comprarlas como un componente de terceros en lugar de desarrollarlas internamente. Hay varios SDK disponibles de terceros que son compatibles con WinRT, pero ninguno que sea compatible específicamente con UWA. Sin embargo, todos los SDK de WinRT tienen archivos binarios diferentes para Windows Phone y aplicaciones de escritorio de Windows. y todos los binarios se crean a partir de la fuente C/C++. Esto estaba bien con las aplicaciones 'universales' más antiguas porque había un proyecto separado para teléfono y escritorio, por lo que solo podía hacer referencia a diferentes componentes en cada proyecto, pero ahora solo hay un proyecto para agregar referencias.
Le pregunté a un proveedor sobre la compatibilidad con UWA y me dijeron que era imposible, que no podían crear un solo binario para apuntar a ambas plataformas (arm vs x86) y que no sabían cómo mi UWA hacía referencia al archivo correcto cuando la aplicación está construido para la arquitectura adecuada (que es lo que supongo que debería suceder).
Supongo que hay alguna forma (¿quizás en un archivo winmd?) de decir, 'oye, aquí hay dos copias del mismo dll para diferentes arquitecturas de CPU, elige la que estás construyendo' y siempre que la API pública coincida con la aplicación solo usa el correcto?
¿Existe alguna solucion para esto? ¿Alguien sabe cómo se supone que funciona este tipo de referencia? ¿O simplemente no tengo suerte?
Gracias.
Hay una forma de hacer referencia a la misma DLL con diferentes arquitecturas en un proyecto, pero no puede hacerlo directamente desde VS. Deberá editar manualmente el archivo csproj.
En tu archivo csproj, tendrás que ir al final y ubicar las secciones. Estas secciones hacen referencia a todos sus archivos.
Hay una etiqueta especial en la definición del proyecto que le permite decirle a Visual Studio que realice algunas acciones específicas en función de algunas condiciones. Luego puede crear un grupo que hará referencia a sus dependencias de DLL. Su archivo csproj será el siguiente: (He eliminado todas las cosas no relevantes)
<Project> <PropertyGroup /> <PropertyGroup /> <PropertyGroup /> <ItemGroup /> <ItemGroup /> <Choose> <When Condition=" '$(Platform)' == 'x86' "> <ItemGroup> <Content Include="..\Binaries\x86\MyLib1.winmd"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <Content Include="..\Binaries\x86\MyLib2.winmd"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> </When> <When Condition=" '$(Platform)' == 'ARM' "> <ItemGroup> <Content Include="..\Binaries\ARM\MyLib1.winmd"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <Content Include="..\Binaries\ARM\MyLib2.winmd"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> </When> </Choose> <Import /> <Import /> </Project>Lo he usado en VS2013 para algunos proyectos de Windows Phone (para que funcionen tanto en el teléfono como en el emulador). No lo he probado en Windows 10 y VS2015, pero debería funcionar de la misma manera.