我正在开发Unity插件项目并尝试从c#文件导入c ++本机dll。 但我不断得到dllnotfoundexception。
c ++ dll代码:
extern "C" {
extern __declspec( dllexport ) bool IGP_IsActivated();
}
c#code:
[DllImport("mydll")]
private static extern bool IGP_IsActivated();
Dll到位,FIle.Exists正常工作。所有依赖的dll都存在于同一层次结构中,但我仍然在dllnotfound异常中结束。
任何帮助,非常感谢!!
答案 0 :(得分:7)
感谢这个Unity forum post我提出了一个很好的解决方案,可以在运行时修改PATH
- 环境变量:
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:
如果你一直收到命名空间错误,这意味着你导入的dll有非托管代码,必须将它包装到另一个托管dll Pugin才能工作。
这些线程有点过时但仍然相关
答案 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
我的解决方法是: