12

Unity Plugin プロジェクトに取り組んでおり、c# ファイルから c++ ネイティブ dll をインポートしようとしています。しかし、dllnotfoundexception が発生し続けます。

c++ dll コード:

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

c# コード:

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

Dll が配置され、FIle.Exists が正常に動作します。すべての依存 dll は同じ階層に存在しますが、それでも dllnotfound 例外が発生します。

どんな助けでも大歓迎です!!

4

8 に答える 8

11

このUnity フォーラムの投稿のおかげPATHで、実行時に -environment 変数を変更する優れたソリューションを思いつきました。

  • すべてのDLL (Unity がインターフェースする DLL とそれらに依存する DLL の両方) を に入れProject\Assets\Wherever\Works\Best\Pluginsます。
  • 次の静的コンストラクターを、プラグインを使用するクラスに入れます。

    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);
    }
    
  • [InitializeOnLoad]クラスに追加して、エディターの起動時にコンストラクターが実行されるようにします

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

このスクリプトでは、DLL をコピーする必要はありません。Unity エディターはそれらをAssets/.../Plugins/...-folder で見つけ、実行可能ファイルは..._Data/Plugins-directory (ビルド時に自動的にコピーされる場所) でそれらを見つけます。

于 2015-10-14T11:35:23.357 に答える
5

さて、私はそれを働かせました。この問題に直面する可能性のある他の人のために、複数の dll がある場合は、セカンダリ dll を Unity エディターのルート レベル (例: C:\Program Files\Unity\Editor) に配置し、スクリプトから実際に参照されている dll をプラグイン フォルダ。これは私にとってはうまくいきました。

于 2012-04-04T20:24:55.573 に答える
5

Project\Assets\Wherever\Works\Best\Plugins に DLL(s) Unity インターフェイスを配置します。

プロジェクト内のスクリプトによって直接アクセスされない依存関係 DLL を配置します。これにより、プログラムをエディターで実行できるようになります。

ビルドするときは、依存関係の DLL ファイルをもう一度コピーします。今度は、ビルド ディレクトリのルート (生成された実行可能ファイルのすぐ隣) にコピーします。これにより、アプリケーションが実行時にそれらをロードできるようになります。

(ヒント: Dependency Walkerを使用して DLL を調べ、それらが何に依存しているかを確認できます。)

于 2014-01-25T03:18:52.207 に答える
2

次のチェックリストが満たされていることを確認してください。

  • プラグインはすべて、Plugins というフォルダーに保存する必要があります。
  • dll がビルドされているアーキテクチャ (x86 または x86_64) は、Unity エディターのアーキテクチャ バージョンに対応している必要があります。Unity エディター 32 ビットは 64 ビット プラグインをロードしません。
  • 32 ビット アーキテクチャと 64 ビット アーキテクチャの両方をターゲットにしている場合は、dll を Plugins フォルダ内の特別な名前のフォルダに配置する必要があります。名前は、32 ビット dll の場合は Plugins/x86、64 ビット dll の場合は Plugins/x86_64 (x64 も動作します) です。
  • Visual C++ 再頒布可能パッケージをインストールする必要があります。2008年から全部持っています。
  • ビルドするときは、すべての dll を実行可能ファイルがあるルートにコピーする必要があります (正しい x86/x64 アーキテクチャ用に再度ビルドします)。

名前空間エラーが発生し続ける場合は、インポートしている dll にアンマネージ コードが含まれていることを意味し、動作させるには別のマネージ dll Pugin にラップする必要があります。

これらのスレッドは少し古くなっていますが、まだ関連性があります

DLLNotFoundException - Unity3D プラグイン

カスタム dll での Unity 内部コンパイラ エラー

于 2016-01-26T21:31:35.597 に答える
0

Pluginsフォルダーの下にdllを置くだけで、それは私にとってはうまくいきます

于 2014-10-08T10:40:49.740 に答える