1

我在我的应用程序运行时加载一个程序集:

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,所以这可能是唯一合理的做法。否则,我会将其发布为答案。

4

1 回答 1

0

Basically my problem was a simple one hidden inside a (kind of) subtle one. The problem was just it didn't know where to look for the DLL. I was confused by the fact, I thought the DLL had already been loaded once. In fact, since the DLL was not used, it was never loaded so the working DLL never failed.

If people find this, I suppose my advice would be make sure the working DLL is actually loading the problematic DLL by using something from it.

于 2013-10-22T11:35:16.923 回答