IO异常加载程序集无法找到文件

时间:2013-10-21 20:34:33

标签: c# reflection dll unity3d assemblies

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

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

1 个答案:

答案 0 :(得分:0)

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

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