【问题标题】:IO Exception loading Assembly can't find fileIO 异常加载程序集找不到文件
【发布时间】:2013-10-21 20:34:33
【问题描述】:

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

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

【问题讨论】:

    标签: c# reflection dll unity3d assemblies


    【解决方案1】:

    基本上,我的问题是一个隐藏在(某种)微妙问题中的简单问题。问题只是它不知道在哪里寻找 DLL。我对这个事实感到困惑,我认为 DLL 已经加载过一次。事实上,由于未使用 DLL,因此从未加载过它,因此工作 DLL 从未失败。

    如果人们发现了这一点,我想我的建议是确保工作 DLL 实际上是通过使用其中的某些内容来加载有问题的 DLL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多