2012-04-03 7 views
7

Sto lavorando al progetto Unity Plugin e provo ad importare la dll nativa C++ dal file C#. Ma continuo a non dllnotfoundexception.DllNotFoundException in unity3d plug-in per C++ dll

codice C++ dll:

extern "C" { 
extern __declspec(dllexport) bool IGP_IsActivated(); 
} 

codice C#:

[DllImport("mydll")] 
    private static extern bool IGP_IsActivated(); 

Dll è a posto e File.Exists funziona correttamente. Tutte le DLL dipendenti sono presenti nella stessa gerarchia, ma finisco comunque con l'eccezione dllnotfound.

Qualsiasi aiuto, molto apprezzato !!

+0

il plug-in è disponibile da qualche parte? – Alex

risposta

3

Beh, ho funzionato. Per gli altri che potrebbero affrontare questo problema, se hai più di una dll, devi mettere le dll secondarie al livello root dell'editor Unity (ad es. C: \ Programmi \ Unity \ Editor) e la dll di riferimento effettiva dallo script nella cartella dei plugin. Questo ha funzionato per me.

+4

Un posto migliore per i file dll si trova nella cartella del progetto. Basta posizionare i file dll nella stessa cartella delle cartelle "Risorse" e "Libreria". – TrolleFar

+0

@TrolleFar questo ha funzionato per me, mi ha risparmiato ore di mal di testa grazie ragazzi per aver postato domande, risposte e commenti! – hsmith

+2

Continuo a ottenere quelle eccezioni anche io posto il file dll nella directory del progetto e nella cartella stessa del file exe dopo la compilazione. Sono necessari Redistributable di Visual C++? Costruisco dll da Visual C++ 2008 SP1 e installato tutto Visual C++ 2008 Redistributable disponibile nel sito Web di microsoft, ma ottengo ancora dll di eccezione non trovato in altra macchina. – Akirayjin

4

Inserire le interfacce di unità DLL con in Project \ Assets \ Wherever \ Works \ Best \ Plugins.

Posizionare qualsiasi DLL di dipendenza a cui non si accede direttamente dagli script in Project. Ciò consentirà al tuo programma di funzionare nell'editor.

Quando si crea, copiare nuovamente i file DLL di dipendenza, questa volta nella directory principale della directory di generazione (proprio accanto al file eseguibile generato). Ciò dovrebbe consentire alla tua applicazione di caricarli in fase di runtime.

(Suggerimento:. È possibile utilizzare Dependency Walker ti guardano DLL e vedere quello che dipende)

0

appena messo il dll nella cartella Plugin e che funziona per me

5

Grazie a questo Unity forum post mi è venuta con una bella soluzione che modifica la variabile -Ambiente PATH in fase di esecuzione:

  • Mettere tutti DLL (entrambe le DLL quali interfacce Unity con e le loro DLL dipendenti) in Project\Assets\Wherever\Works\Best\Plugins.
  • Mettere il costruttore statico in seguito in una classe che utilizza il plugin:

    static MyClassWhichUsesPlugin() // static Constructor 
    { 
        var currentPath = Environment.GetEnvironmentVariable("PATH", 
         EnvironmentVariableTarget.Process); 
    #if UNITY_EDITOR_32 
        var dllPath = Application.dataPath 
         + Path.DirectorySeparatorChar + "SomePath" 
         + Path.DirectorySeparatorChar + "Plugins" 
         + Path.DirectorySeparatorChar + "x86"; 
    #elif UNITY_EDITOR_64 
        var dllPath = Application.dataPath 
         + Path.DirectorySeparatorChar + "SomePath" 
         + Path.DirectorySeparatorChar + "Plugins" 
         + Path.DirectorySeparatorChar + "x86_64"; 
    #else // Player 
        var dllPath = Application.dataPath 
         + Path.DirectorySeparatorChar + "Plugins"; 
    
    #endif 
        if (currentPath != null && currentPath.Contains(dllPath) == false) 
         Environment.SetEnvironmentVariable("PATH", currentPath + Path.PathSeparator 
          + dllPath, EnvironmentVariableTarget.Process); 
    } 
    
  • Aggiungere [InitializeOnLoad] alla classe per assicurarsi che il costruttore è run at editor launch:

    [InitializeOnLoad] 
    public class MyClassWhichUsesPlugin 
    { 
        ... 
        static MyClassWhichUsesPlugin() // static Constructor 
        { 
         ... 
        } 
        } 
    

Con questo script non è necessario copiare le DLL. L'editor di Unity li trova nella cartella Assets/.../Plugins/... e l'eseguibile li trova nella directory ..._Data/Plugins (dove vengono automaticamente copiati durante la creazione).

1
  • I plug-in dovrebbero rimanere tutti in una cartella denominata Plugin.
  • L'architettura per cui la DLL è stata creata (x86 o x86_64) deve corrispondere alla versione di architettura di Unity Editor. Unity Editor a 32 bit non caricherà plug-in a 64 bit e viceversa.
  • Se si prendono di mira architetture sia a 32 che a 64 bit, è necessario inserire le DLL in cartelle con nome speciale all'interno della cartella Plugin. I nomi sono Plugin/x86 per dll a 32 bit e Plugin/x86_64 (x64 funziona anche) per dll a 64 bit.
  • È necessario installare ridistribuibili di Visual C++. Ho tutto a partire dal 2008.
  • Quando si crea di tutte le DLL dovrebbero essere copiati nella stessa strada del vostro eseguibile (e ancora una volta costruito per il corretto x86/architettura x64)

Questi thread sono un po 'datata ma ancora attuale

DLLNotFoundException - Unity3D Plugin

Unity internal compiler error with custom dll

1

ho passato una giornata con questo errore. Il mio problema era che Android non ottiene la libreria e ottiene sempre errore DDLNotFound. La mia soluzione era:

1.- Assicurarsi di disporre delle librerie per l'architettura corretta nella cartella Plugin.

Plugins/Android/x86 e Plugins/Android/armeabi-V7A se le tue impostazioni di generazione è grasso (x86 & braccio)

2.- Verificare che l'Unità li riconosce come le biblioteche. Se li selezioni nella scheda Progetto, dovresti vederli come una libreria e la piattaforma e l'architettura correlati.

3.- Dopo la compilazione (non chiudere Unity Editor!), È possibile controllare Temp/StagingArea/libs se le librerie sono presenti. Se ci sono di sicuro le librerie saranno nell'APK. Come doppio controllo, puoi aprire il tuo APK (cambia in estensione zip) e vedere le librerie nella cartella lib.

4.- In C# è necessario rimuovere il prefisso lib nel nome della libreria, ad esempio:

Se il nome della libreria è "libdosomething.so" si dovrebbe chiamare come

[DllImport (" dosomething ")]

spero che questo lavoro per voi :)

Cin cin.