2012-05-02 11 views
6

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

3

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.

1

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.

1

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 .

https://github.com/kevin-marshall/Managed.AnyCPU

+0

¿Por qué tengo un voto negativo para este comentario? –

+0

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 –

+0

Gracias Ivan! Aprecio tu apoyo :) –

Cuestiones relacionadas