DllNotFoundException im unity3d-Plugin für c ++ dll

Ich arbeite am Unity Plugin-Projekt und versuche, die native c ++ -Dll aus der c # -Datei zu importieren. Aber ich bekomme immer wieder dllnotfoundexception.

c ++ dll code:

<code>extern "C" {
extern __declspec( dllexport ) bool IGP_IsActivated();
}
</code>

c # code:

<code>[DllImport("mydll")]
    private static extern bool IGP_IsActivated();
</code>

DLL ist vorhanden und FIle.Exists funktionieren ordnungsgemäß. Alle abhängigen DLLs sind in derselben Hierarchie vorhanden, aber ich lande immer noch in der Ausnahme dllnotfound.

Jede Hilfe, sehr geschätzt !!

 Alex18. Dez. 2013, 17:09
ist das Plugin irgendwo verfügbar?

Antworten auf die Frage(6)

Plugins sollten alle in einem Ordner namens Plugins bleiben.Die Architektur, für die Ihre DLL erstellt wurde (x86 oder x86_64), muss der Architekturversion von Unity Editor entsprechen. Unity Editor 32-Bit lädt keine 64-Bit-Plugins und umgekehrt.Wenn Sie sowohl auf 32- als auch auf 64-Bit-Architekturen abzielen, sollten Sie Ihre DLLs in speziell benannten Ordnern im Plugins-Ordner ablegen. Die Namen lauten Plugins / x86 für 32-Bit-DLLs und Plugins / x86_64 (x64 funktioniert auch) für 64-Bit-DLLs.Visual C ++ Redistributables muss installiert sein. Ich habe alles von 2008.Wenn Sie alle Ihre DLLs erstellen, sollten Sie diese in das Stammverzeichnis kopieren, in dem sich Ihre ausführbare Datei befindet (und erneut für die richtige x86 / x64-Architektur erstellen).

Wenn weiterhin ein Namespace-Fehler auftritt, bedeutet dies, dass die zu importierende DLL nicht verwalteten Code enthält und dass sie in eine andere verwaltete DLL-Pugin eingebunden werden muss, damit sie funktioniert.

Diese Themen sind etwas veraltet, aber immer noch relevant

DLLNotFoundException - Unity3D-Plugin

Interner Unity-Compiler-Fehler mit benutzerdefinierter DLL

 vipin816928. Feb. 2019, 03:56
Hallo, könntest du mir bitte dabei helfen?stackoverflow.com/questions/54898629/…

i mir

ich habe es geschafft. Für andere, die möglicherweise mit diesem Problem konfrontiert sind, müssen Sie, wenn Sie mehr als eine DLL haben, die sekundären DLLs im Stammverzeichnis des Unity-Editors (z. B. C: \ Programme \ Unity \ Editor) und die tatsächlich referenzierte DLL aus dem Skript speichern Plugins-Ordner. Das hat bei mir funktioniert.

 vipin816928. Feb. 2019, 04:02
Versuchte alles, nichts hat funktioniert. Bitte helfen Siestackoverflow.com/questions/54898629/…
 jozzas11. Aug. 2014, 06:21
Ich habe all diese Lösungen stundenlang ausprobiert. Es stellte sich heraus, dass meine externe DLL eine 32-Bit-DLL und mein Unity-Projekt eine 64-Bit-DLL war. Hat bekommenDllNotFoundException so wurde den Gartenweg hinuntergeführt ... eine andere Sache, auf die man achten sollte.
 TrolleFar04. Juli 2012, 02:25
Ein besserer Ort für die DLL-Dateien wäre im Projektordner. Legen Sie einfach die DLL-Dateien in den gleichen Ordner wie die Ordner "Assets" und "Library".
 Akirayjin05. Sept. 2013, 05:53
Ich behalte diese Ausnahme, auch wenn ich die DLL-Datei nach dem Erstellen in das Projektverzeichnis und in den gleichen Ordner wie die exe-Datei lege. Werden Visual C ++ Redistributable benötigt? Ich baue eine DLL aus Visual C ++ 2008 SP1 und installiere alle Visual C ++ 2008 Redistributable-Dateien, die auf der Microsoft-Website verfügbar sind. Es werden weiterhin Ausnahmedlls angezeigt, die auf keinem anderen Computer gefunden wurden.
 hsmith06. März 2013, 07:06
@TrolleFar das hat bei mir funktioniert, hat mir stundenlange Kopfschmerzen erspart, danke Jungs für das Posten der Fragen, Antworten und Kommentare!

Beitrag im Unity-Forum Ich habe eine nette Lösung gefunden, die das modifiziertPATH-Umgebungsvariable zur Laufzeit:

Stellenalles DLLs (sowohl die DLLs, mit denen Unity zusammenarbeitet, als auch deren abhängige DLLs) inProject\Assets\Wherever\Works\Best\Plugins.

Fügen Sie den folgenden statischen Konstruktor in eine Klasse ein, die das Plugin verwendet:

<code>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);
}
</code>

Hinzufügen[InitializeOnLoad] an die Klasse, um sicherzustellen, dass der Konstruktor istbeim Start des Editors ausführen:

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

Mit diesem Skript müssen keine DLLs kopiert werden. Der Unity-Editor findet sie imAssets/.../Plugins/...-Ordner und die ausführbare Datei findet sie in..._Data/Plugins-Verzeichnis (wo sie beim Erstellen automatisch kopiert werden).

 rusty22. März 2018, 17:30
Ich konnte die Statik in Unity 2017.3.1f1 nicht zum Laufen bringen. Zur Laufzeit bekam ich: "UnityException: get_dataPath darf nicht von einem MonoBehaviour-Konstruktor (oder Instanzfeldinitialisierer) aufgerufen werden, sondern wird stattdessen in Awake oder Start aufgerufen." Ich habe es auf Awake () umgestellt und es hat gut funktioniert und der Editor & in meinem Build.
 Hafnernuss09. Apr. 2019, 23:47
Dies ist tatsächlich eine sehr elegante Lösung, die die Verwendung externer Bibliotheken im Edtior-Modus (für die Verwendung mit Inspector-Skripten) ermöglicht, was auf "normale" Weise nicht einfach zu bewerkstelligen ist.

dass Android die Bibliothek nicht bekommt und immer einen DDLNotFound-Fehler bekommt. Meine Lösung war:

1.- Vergewissern Sie sich, dass Sie die Bibliotheken für die richtige Architektur im Plugins-Ordner haben.

Plugins / Android / x86 und Plugins / Android / armeabi-v7a, wenn Ihre Build-Einstellungen FAT (x86 & arm) sind

2.- Vergewissern Sie sich, dass Unity sie als Bibliotheken erkennt. Wenn Sie sie auf der Registerkarte "Projekt" auswählen, sollten Sie sie als Bibliothek und in Bezug auf Plattform und Architektur anzeigen.

3.- Nach dem Build (Unity Editor nicht schließen!) Können Sie in Temp / StagingArea / libs nachsehen, ob Ihre Bibliotheken vorhanden sind. Wenn es dort sicher gibt, werden die Bibliotheken in der APK sein. Zur Kontrolle können Sie Ihre APK öffnen (zur Zip-Erweiterung wechseln) und die Bibliotheken im Ordner lib anzeigen.

4.- In C # sollten Sie alle lib-Präfixe in Ihrem Bibliotheksnamen entfernen, zum Beispiel:

Wenn Ihr Bibliotheksname "libdosomething.so" ist, sollten Sie ihn als "libdosomething.so" bezeichnen

[DllImport ("Dosomething")]

Ich hoffe das klappt für dich :)

Prost.

 Adrian G14. Feb. 2019, 11:09
Das hat mir geholfen. Ich verwende Unity 2018.3 und die richtige Architektur ist jetzt Plugins / Android_x86 und Plugins / Android_armeabi-v7a. Ich habe auch eine Bibliothek in Plugins / Android_arm64-v8a abgelegt, aber während Unity sie als arm64 erkennt, wird sie nicht verwendet. Android_x86_64 wird nicht unterstützt

ver \ Works \ Best \ Plugins ein.

Platzieren Sie alle Abhängigkeits-DLLs, auf die Ihre Skripts nicht direkt zugreifen, in Project. Dadurch kann Ihr Programm im Editor ausgeführt werden.

Kopieren Sie beim Erstellen erneut die Abhängigkeits-DLL-Dateien, diesmal in das Stammverzeichnis des Erstellungsverzeichnisses (direkt neben der generierten ausführbaren Datei). Dies sollte es Ihrer Anwendung ermöglichen, sie zur Laufzeit zu laden.

(Tipp: Sie können verwendenAbhängigkeits-Wanderer Schauen Sie sich Ihre DLLs an und sehen Sie, wovon sie abhängen.)

Ihre Antwort auf die Frage