Tengo un dll administrado de C++ al que me refiero desde un proyecto de C#. El proyecto C# se compilará como AnyCPU. ¿Hay alguna forma de compilar una versión de 32 bits y 64 bits del dll Managed C++ y luego decirle al proyecto C# en tiempo de ejecución que cargue el correcto dependiendo de qué arquitectura se está ejecutando?Managed C++ y AnyCPU
Respuesta
This article se analiza una forma compleja de hacerlo, y ver el comentario de Stefan que analiza un método mucho más simple que se aplica a algunas aplicaciones.
No sé cómo 'hace referencia' al dll de C++ (referencia de conjunto de P/Invoke frente a .NET), pero de cualquier forma podría intercambiar las dos versiones de .dll en el momento de la instalación.
El truco para hacer que AnyCPU dll juegue con el dll de C++, es en tiempo de ejecución, asegúrese de que el ensamblado no pueda cargar el dll de C++ y luego suscríbase al evento AppDomain AssemblyResolve. Cuando el ensamblado intenta cargar el dll y falla, su código tiene la oportunidad de determinar qué dll necesita cargarse.
La suscripción al evento se ve algo como esto:
System.AppDomain.CurrentDomain.AssemblyResolve += Resolver;
Controlador de eventos es como la siguiente:
System.Reflection.Assembly Resolver(object sender, System.ResolveEventArgs args)
{
string assembly_dll = new AssemblyName(args.Name).Name + ".dll";
string assembly_directory = "Parent directory of the C++ dlls";
Assembly assembly = null;
if(Environment.Is64BitProcess)
{
assembly = Assembly.LoadFrom(assembly_directory + @"\x64\" + assembly_dll);
}
else
{
assembly = Assembly.LoadFrom(assembly_directory + @"\x86\" + assembly_dll);
}
return assembly;
}
He creado un proyecto simple que demuestra cómo acceder a C funcionalidad ++ desde una DLL Cualquier CPU .
- 1. Hep Managed y Unmanaged
- 2. Managed C++ (C++/CLI) vs C#/VB.NET
- 3. ¿Cuál es la diferencia entre Managed C++ y C++/CLI?
- 4. Matrices de cadenas en Managed C++
- 5. memoria no administrada y Managed memoria
- 6. Session Beaded managed Bean y ActionListener
- 7. ¿Hay alguna herramienta para convertir Managed C++ a C++/CLI?
- 8. AnyCPU/x86/x64 para la aplicación C# y su dependencia C++/CLI
- 9. Verbatim Literals en Managed C++? (como C# 's @ "blah")
- 10. ¿Cómo puedo usar un dll C# (managed) que no tengo?
- 11. ¿Cómo verificar una "referencia de objeto NULL" en Managed C++?
- 12. Application vs Container Managed EntityManager
- 13. ¿Microsoft está protegiendo Managed DirectX?
- 14. NodeJS Managed Hostings contra VPS
- 15. JSF Managed Bean auto-create?
- 16. "AnyCPU" vs "Cualquier CPU" en TFS 2010
- 17. ¿Reemplaza XNA de manera efectiva Managed Directx?
- 18. Finalizer Queue crece pero Managed Heaps no
- 19. sessionscoped managed bean vs stateful ejb
- 20. ¿Aries managed-service-factory también administra propiedades?
- 21. ¿Puede un proyecto C# AnyCPU incluir un dll específico de plataforma?
- 22. C# Solution, ¿pueden todos los proyectos apuntar a AnyCPU, excepto uno que debe ser x86?
- 23. Ejecute AnyCPU como 32 bits en sistemas de 64 bits
- 24. ¿Qué significan las declaraciones "#pragma administrado (push, off)" y "#pragma managed (pop)"?
- 25. Cargando un archivo CSV en Core Data managed sqlite db
- 26. Cómo escuchar Keydown-Events en un HTML5-Canvas KineticJS-managed?
- 27. sesión beaded managed bean vs stateful bean vs httpsession
- 28. JSF, EL, Managed Beans - ¿Cómo saber qué son las firmas getter y setter?
- 29. ¿Qué significa "ámbitos múltiples" cuando se habla de MEF (Managed Extensibility Framework) y .NET 4.5?
- 30. Rendimiento de una aplicación C# basada en AnyCPU vs plataforma x64 en una máquina de 64 bits
¿Por qué tengo un voto negativo para este comentario? –
Yo también. No estoy seguro de si haría esto en producción, pero esta es al menos una idea viable. Upvoted vuelve a cero para revertir la injusticia –
Gracias Ivan! Aprecio tu apoyo :) –