本文介绍了用于C ++ DLL的unity3d插件中的DllNotFoundException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究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到位并且文件存在.正常工作.所有依赖的dll都存在于相同的层次结构中,但我仍然会遇到dllnotfound异常.

任何帮助,万分感谢!

解决方案

感谢此 Unity论坛帖子我想出了一个不错的解决方案,该解决方案在运行时修改了PATH -environment变量:

  • Project\Assets\Wherever\Works\Best\Plugins中放置所有个DLL(Unity与之交互的DLL及其依赖的DLL).
  • 将以下静态构造函数放入使用插件的类中:

    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/...文件夹中找到它们,而可执行文件在..._Data/Plugins-目录中找到它们(构建时会在其中自动复制它们).

I am working on the Unity Plugin project and try to import the c++ native dll from c# file.But I keep getting dllnotfoundexception.

c++ dll code:

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

c# code:

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

Dll is in place and FIle.Exists work properly. All dependent dlls are present at same hierarchy, but I still end up in dllnotfound exception.

Any help, much appreciated!!

解决方案

Thanks to this Unity forum post I came up with a nice solution which modifies the PATH-environment variable at runtime:

  • Put all DLLs (both the DLLs which Unity interfaces with and their dependent DLLs) in Project\Assets\Wherever\Works\Best\Plugins.
  • Put the following static constructor into a class which uses the 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);
    }
    

  • Add [InitializeOnLoad] to the class to make sure that the constructor is run at editor launch:

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

With this script there is no need to copy around DLLs. The Unity editor finds them in the Assets/.../Plugins/...-folder and the executable finds them in ..._Data/Plugins-directory (where they get automatically copied when building).

这篇关于用于C ++ DLL的unity3d插件中的DllNotFoundException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 03:21
查看更多