2012-05-02 16 views
6

Ho una DLL C++ gestita a cui faccio riferimento da un progetto C#. Il progetto C# verrà compilato come AnyCPU. Esiste un modo per compilare una versione a 32 bit e 64 bit del dll gestito C++ e quindi dire al progetto C# in fase di esecuzione di caricare quello corretto a seconda dell'architettura che viene eseguita?Managed C++ e AnyCPU

risposta

3

This article discute un modo complesso per farlo e vedere il commento di Stefan che discute un metodo molto più semplice che si applica ad alcune applicazioni.

1

Non so come si fa "riferimento" alla DLL C++ (riferimento di assembly P/Invoke vs .net), ma in entrambi i casi è possibile scambiare le due versioni del file .dll al momento dell'installazione.

1

Il trucco per ottenere la DLL AnyCPU da giocare con la DLL C++, è in fase di esecuzione assicurarsi che l'assembly non può caricare la DLL C++ e quindi iscriversi all'evento AppDomain AssemblyResolve. Quando l'assembly tenta di caricare la DLL e non riesce, il codice ha l'opportunità di determinare quale DLL deve essere caricata.

Sottoscrivere l'evento sembra qualcosa di simile:

System.AppDomain.CurrentDomain.AssemblyResolve += Resolver; 

gestore di eventi simile a questa:

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; 
} 

ho creato un semplice progetto che dimostra come accedere C funzionalità ++ da un dll AnyCPU .

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

+0

Curioso perché ho ottenuto un voto negativo per questo commento? –

+0

Anch'io. Non sono sicuro se lo farei in produzione, ma questa è almeno un'idea valida. Votato a zero per annullare l'ingiustizia –

+0

Grazie Ivan! Apprezzo il tuo supporto :) –

Problemi correlati