2010-01-19 3 views
7

Sembra che Mono ignori le dllmap nel file di configurazione locale.mono ignora le dllmap nel file app.config

Desidero eseguire il porting della mia applicazione .NET su Linux (ubuntu) che chiama le librerie native, quindi ho dllmaps per far funzionare il mio codice. I documenti mono dicono che devi creare qualcosa.exe.config per qualcosa.exe e inserire le configurazioni specifiche dell'applicazione al suo interno. analizza il file (perché si lamenta se faccio degli errori di ortografia) e il nome del file è corretto ma sembra che ignori le dllmaps.

Il file di configurazione è semplice:

<configuration> 
<dllmap dll="i:openal32.dll" target="libopenal.so" /> 
</configuration> 

Mono non trova l'openal32.dll e getta DllNotFoundException. Ma se copio quella voce di dllmap nel file principale/etc/mono/config, allora tutto va bene. Se fai un $ MONO_LOG_LEVEL = debug mono ... trucco per vedere cosa fa e vedo che non c'è alcun tentativo di caricare libopenal.so affatto. Ma molti cercano di caricare i file libopenal32.dll, ./libopenal32.dll libopenal32.so, openal32.so, ecc.

Probabilmente mi sono imbattuto nuovamente in un bug Mono?

Voglio impacchettare questo file di configurazione nell'archivio e non voglio chiedere ai miei utenti di fare confusione con il file/etc/mono/config.

Qualche idea?

risposta

7

Tutti gli attributi di DllImport nel codice utilizzano "openal32.dll" o alcuni utilizzano "openal32"? In ogni caso il file di configurazione fa riferimento all'assembly che contiene i metodi P/Invoke: il problema più probabile è che hai creato la configurazione per l'assembly principale mentre i metodi P/Invoke si trovano in un assembly della libreria separato. Basta rinominare il file in OpenAlUsingAssembly.dll.config.

+0

Questo era il problema ... Ho scritto il file di configurazione all'assembly sbagliato. Uno dei miei riferimenti usa la DLL non l'applicazione principale. – Calmarius

+0

+1 hai un brillante futuro scrivendo documenti mono deobfuscation. :) –

1

Stavo solo avendo lo stesso problema durante il tentativo di eseguire il mio programma di test OpenAL (in realtà OpenTK) in Ubuntu 12.04. Alla fine tutto quello che dovevo fare era:

sudo apt-get install libopenal1 

Al fine di ottenere le librerie di runtime OpenAL e quindi creare un file chiamato OpenTK.dll.config contenente:

<configuration> 
    <dllmap dll="i:openal32.dll" target="libopenal.so.1" /> 
</configuration> 

Quale mappato il importa in OpenTK.dll dal file windows openal32.dll alla versione corretta della libreria condivisa sotto linux, che è il mio caso è libopenal.so.1 (che in realtà sembra essere solo un collegamento a libopenal.so.1.13.0).