我在我的应用程序运行时加载一个程序集:
FileStream lDLLStream = lDLLPath.OpenRead();
byte[] lDLLArray = new byte[lDLLStream.Length];
lDLLStream.Read(lDLLArray, 0, (int)lDLLStream.Length);
Assembly lAssembly = Assembly.Load(lDLLArray);
但是,我收到以下异常:
Could not load file or assembly 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
但是,如果我从引用了我最初尝试加载的 DLL 的同一目录中加载不同的 DLL(当然 UnityEngine 因为它也依赖于它),我不会收到任何错误消息。
事实上,在加载时,您可以准确地看到第二个(工作的)DLL 在其引用的程序集中:
UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
所以我看不到它是否可以加载第二个 DLL,是什么导致它无法加载第一个 DLL。
一些附加信息:第一个(非工作)DLL 正是由 Unity(3D 游戏引擎)生成的 DLL,而第二个 DLL 是我在 Unity 解决方案中创建的项目。
我的项目是 .NET 4.0(而 Unity 是 3.5),但我尝试将我的测试 DLL 设置为编译为 3.5,并且在加载时没有崩溃。
我不知道这是否会更好地在 Unity Answers 上提出?
更新:好吧,也许不像我想的那么奇怪。第二个工作 DLL 只是工作,因为它没有使用它无法加载的 DLL,所以从来没有失败。另外,可以通过将Unity DLL转储到执行目录中来加载第一个DLL,所以我想我只需要找到一种将目录添加到它应该查找的位置的方法。
更新 2:所以我通过收听“修复”了这个问题
AppDomain.CurrentDomain.AssemblyResolve
并向用户显示一个对话框,以查找已修复异常的丢失 DLL。如果有更好的方法可以做到这一点,我将不胜感激。由于用户正在指定自定义 DLL,所以这可能是唯一合理的做法。否则,我会将其发布为答案。