2009-07-21 25 views
12

Attualmente stiamo testando Mono per vedere se le nostre DLL .NET funzioneranno per i clienti su Linux. Le nostre DLL forniscono componenti per Windows Form. Ho inserito le DLL nella directory Debug, aggiunto i riferimenti e creato una classe derivante da un Windows Form. La classe era corsa autonoma bene, ma dopo ho aggiunto i riferimenti DLL e ha creato uno dei nostri componenti (l'intellisense ha funzionato bene), si compila ma non verrà eseguito:Utilizzo della DLL di assemblaggio .NET precompilato in Mono?

 
** (/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905): WARNING **: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. 
File name: 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' 

ho guardato le proprietà del gruppo, ed è quella versione con quella chiave pubblica.

C'è un modo per utilizzare queste DLL? Che cosa sto facendo di sbagliato?

EDIT:

Secondo MoMA, a parte alcuni [MonoTodo] s che non hanno alcuna influenza sulla situazione, v'è un problema in tre delle DLL:

 
Calling Method | P/Invoke Method | P/Invoke Library 
void OnHandleCreated (EventArgs) | int GoText/ComboBoxControl.SetWindowTheme (IntPtr, string, string) | uxtheme.dll 

Tuttavia, Aprii uno dei nostri progetti di esempio creati con VS2008, ha indicato il riferimento alla DLL nel posto giusto e ha funzionato correttamente. Ma non ho potuto ottenere il riferimento per lavorare in un nuovo progetto. Sto facendo qualcosa di sbagliato?

MODIFICA 2: Per chiarire, non vogliamo ricreare un'applicazione Windows esistente: stiamo simulando un cliente che crea una nuova applicazione con la nostra DLL. Stavo solo testando per vedere se si trattava di un problema di dll. Poiché l'applicazione VS-made è stata in grado di trovare la DLL ed eseguire correttamente, sembrerebbe che non sia un problema di dll. La nuova applicazione non chiama nulla che l'applicazione creata da VS non abbia.

risposta

9

Provare la DLL con MOMA (Mono Migration Analyzer) per verificare se utilizza API non supportate.

+0

Appena aggiunto i dettagli MoMA sopra. Funziona comunque bene con l'app di esempio. Non solo con l'app appena creata fatta con MonoDevelop. – NickAldwin

+0

Non è necessario (non dovrebbe) ricreare l'app in MonoDevelop. Mono dovrebbe essere in grado di eseguire le DLL compilate in Visual Studio. Guarderei quella chiamata ComboBoxControl.SetWindowsTheme - che sta facendo la chiamata p/invoke, il che significa che non sarà supportata in Mono. Puoi rimuoverlo o non usare quel controllo? –

+0

Non vogliamo ricrearlo: stiamo simulando un cliente che crea una nuova applicazione con la nostra DLL. Stavo solo testando per vedere se si trattava di un problema di dll. Poiché l'applicazione VS-made è stata in grado di trovare la DLL ed eseguire correttamente, sembrerebbe che non sia un problema di dll. La nuova applicazione non chiama nulla che l'applicazione creata da VS non abbia. – NickAldwin

4

È generalmente possibile ottenere ulteriori informazioni sugli errori di caricamento dll eseguendo con:

MONO_LOG_LEVEL = "debug" MONO_LOG_MASK = mono "dll" myapp.exe

+0

Grazie per la risposta, ma dopo aver impostato quelle variabili di ambiente mono ancora non mi ha dato ulteriori informazioni. – NickAldwin

6

Che Jonathan ha detto è corretto, è necessario esegui il comando come mostrato e produrrà un'abbondante quantità di informazioni.

L'assembly ha un nome sicuro, quindi su Windows si ha una dipendenza installata sul GAC. Se "OUR.ASSEMBLY" che dovrebbe essere lì, eseguire:

gacutil -i OUR.ASSEMBLY.dll

per installarlo. Potrebbero esserci altre dipendenze di cui OUR.ASSEMBLY.dll ha bisogno, che è ciò che mostrerebbe il comando di JPobst.

+0

Non usiamo il GAC, comunque. – NickAldwin

+2

Certo, ma tu hai fortemente chiamato quell'assemblaggio, quindi Mono lo cercherà sul GAC. È possibile sovrascriverlo con "export MONO_PATH = DIR" per scopi diagnostici (verrà comandato a Mono di cercare l'assembly in DIR, indipendentemente dal suo nome sicuro). –

4

I problemi probabili sono che l'assembly non viene inserito nella stessa directory del programma o che la distinzione tra maiuscole e minuscole del nome del file assembly non viene mantenuta quando è stata copiata. Ad esempio, si può avere un riferimento OUR.ASSEMLY, ma il nome file è OurAssembly.DlL o qualsiasi altra combinazione di casi non validi che le persone possono trovare.

+0

Mi sono assicurato che fosse nella stessa dir e nello stesso caso e causava ancora l'errore. – NickAldwin

+0

Se non si desidera scaricare il registro di output dall'impostazione di env vars, è possibile provare ad eseguire mono sotto strace: strace -f -e apri mono yourtest.exe e vedere quale file si sta tentando di carico e dove. – lupus

1

uxtheme.dll è il motore di temi di Windows, se non sbaglio. È abbastanza naturale non averlo in un ambiente non Windows, quindi P/Invocare le sue funzioni esportate non è direttamente possibile.

Hai due opzioni qui:

  1. aprire quella OnHandleCreated metodo e sostituire la chiamata SetWindowTheme con qualcosa portatile o
  2. Creare un manichino libuxtheme.so che contiene solo questa funzione in modo mono può P/Invoke esso .

Suggerisco il primo approccio se possibile, in quanto è necessario creare quel manichino libuxtheme.so per ogni piattaforma che si sta supportando. Ad esempio, dovresti creare un libuxtheme.so per x86 Linux, un libuxtheme.so per x86_64 Linux, lo stesso per FreeBSD, un libuxtheme.dylib per Mac OS X e così via.

Se OnHandleCreated è stato generato da un progettista dell'interfaccia utente o simili, è probabilmente necessario rimuovere alcuni temi widget per sbarazzarsi della chiamata.