c ++ dll的unity3d插件中的DllNotFoundException

时间:2012-04-03 23:40:39

标签: unity3d

我正在开发Unity插件项目并尝试从c#文件导入c ++本机dll。 但我不断得到dllnotfoundexception。

c ++ dll代码:

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

c#c​​ode:

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

Dll到位,FIle.Exists正常工作。所有依赖的dll都存在于同一层次结构中,但我仍然在dllnotfound异常中结束。

任何帮助,非常感谢!!

7 个答案:

答案 0 :(得分:7)

感谢这个Unity forum post我提出了一个很好的解决方案,可以在运行时修改PATH - 环境变量:

  • 将{strong>所有 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]添加到类中以确保构造函数为run at editor launch

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

使用此脚本无需复制DLL。 Unity编辑器在Assets/.../Plugins/... - 文件夹中找到它们,可执行文件在..._Data/Plugins - 目录中找到它们(在构建时它们会自动复制)。

答案 1 :(得分:4)

将DLL(s)Unity接口放在Project \ Assets \ Wherever \ Works \ Best \ Plugins中。

在Project中放置脚本不直接访问的任何依赖项DLL。这将允许您的程序在编辑器中运行。

构建时,再次将依赖项DLL文件复制到构建目录的根目录(紧邻生成的可执行文件)。这应该允许您的应用程序在运行时加载它们。

(提示:您可以使用Dependency Walker查看DLL并查看它们所依赖的内容。)

答案 2 :(得分:3)

嗯,我得到了它的工作。 对于可能遇到此问题的其他人,如果您有多个dll,则需要将辅助dll放在Unity编辑器的根级别(例如C:\ Program Files \ Unity \ Editor),并将实际引用的dll从脚本放入插件文件夹。 这对我有用。

答案 3 :(得分:2)

我花了一天时间来处理这个错误。我的问题是Android没有获得该库并始终得到和DDLNotFound错误。我的解决方案是:

1.-确保您在Plugins文件夹中拥有适当架构的库。

插件/ Android / x86和插件/ Android / armeabi-v7a,如果您的构建设置为FAT(x86& arm)

2.-检查Unity是否将它们识别为库。如果在“项目”选项卡中选择它们,则应将它们视为库以及平台和体系结构相关。

3.-构建之后(不要关闭Unity Editor!),如果你的库在那里,你可以检查Temp / StagingArea / libs。如果肯定有图书馆将在APK中。作为仔细检查,您可以打开APK(更改为zip扩展名)并查看lib文件夹中的库。

4.-在C#中,您应该删除库名中的任何lib前缀,例如:

如果您的图书馆名称是" libdosomething.so"你应该把它称为

[DllImport(" dosomething")]

我希望这对你有用:)

干杯。

答案 4 :(得分:1)

确保满足以下chacklist:

  • 插件应该都位于名为Plugins的文件夹中。
  • 为dll构建的体系结构(x86或x86_64)必须与Unity Editor的体系结构版本相对应。 Unity编辑器32位不会加载64位插件,反之亦然。
  • 如果您的目标是32位和64位架构,则应将dll放在Plugins文件夹中的特殊命名文件夹中。名称为32位dll的Plugins / x86和64位dll的Plugins / x86_64(x64也可以)。
  • 必须安装Visual C ++ Redistributables。我从2008年开始。
  • 构建时,应将所有dll复制到可执行文件所在的根目录中(并再次为正确的x86 / x64体系结构构建)

如果你一直收到命名空间错误,这意味着你导入的dll有非托管代码,必须将它包装到另一个托管dll Pugin才能工作。

这些线程有点过时但仍然相关

DLLNotFoundException - Unity3D Plugin

Unity internal compiler error with custom dll

答案 5 :(得分:0)

将dll放在Plugins文件夹下,这对我有用

答案 6 :(得分:0)

就我而言,我有DllNotFoundException:ovrplatiformloader

 Unity   : DllNotFoundException: ovrplatformloader
 Unity   :   at (wrapper managed-to-native) Oculus.Platform.CAPI.ovr_UnityInitWrapperAsynchronous(string)
 Unity   :   at Oculus.Platform.AndroidPlatform.AsyncInitialize (System.String appId) [0x00013] in <29065e843b82403894fca6c6f2974090>:0 
 Unity   :   at Oculus.Platform.Core.AsyncInitialize (System.String appId) [0x0004f] in <29065e843b82403894fca6c6f2974090>:0 
 Unity   :   at DBHelper.Start () [0x00019] in <29065e843b82403894fca6c6f2974090>:0 

我的解决方法是:

  1. 重新导入不起作用的文件(libovrplatformloader.so)
  2. 重建平台/插件架构。 :平台/插件/Android32/libovrplatformloader.so。 :Platform / Plugins / Android / x86 / libovrplatformloader.so Platform / Plugins / Android / armeabi-v7a / libovrplatformloader.so
  3. 修改libovrplatformloader.so的导入设置。将任何平台更改为仅Android平台,并启用“启动时加载”选择。在armeabit-v7a中选择ARMv7 CPU,在x86文件夹中选择x86 CPU。