用于C ++ DLL的unity3d插件中的DllNotFoundException [英] DllNotFoundException in unity3d plugin for c++ dll

查看:87
本文介绍了用于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异常.

任何帮助,万分感谢!

解决方案

感谢此

  • [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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆