【问题标题】:Assembly.LoadFile() and crashAssembly.LoadFile() 和崩溃
【发布时间】:2014-09-16 19:15:28
【问题描述】:

我使用 Assembly.LoadFile(string path) 将程序集加载到 C# 程序。它可以在我的 PC 和两台笔记本电脑上完美运行,但是……当我试图将这个应用程序发送给我的朋友时,它在这个电话之后就崩溃了,没有任何例外。我们使用相同版本的 .NET Framework,一切都必须没问题。我无法理解会发生什么。没有异常,没有错误,只是“静默”返回。 我也尝试使用 LoadFrom 但没有任何改变。 我使用 dll 文件的绝对路径

public LoadedType[] LoadFrom(string path)
        {
            Assembly assembly = Assembly.LoadFile(path);
        }

调用方法是

Loader loader = new Loader();
        string[] paths = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll", SearchOption.TopDirectoryOnly);
        List<string> corrupted = new List<string>();

        foreach (string path in paths)
        {
            try
            {
                LoadedType[] loadedTypes = loader.LoadFrom(path);
                MessageBox.Show("loaded");

                if (loadedTypes.Length == 0)
                {
                    continue;
                }
                foreach (LoadedType loadedT in loadedTypes)
                {
                    AvailableTypes.Add(loadedT);
                }
            }
            catch (ReflectionTypeLoadException)
            {
                corrupted.Add(Path.GetFileName(path));
            }
        }

MessageBox 没有出现。 有人能解释一下有什么问题吗?为什么这段代码可以在三台 PC 上运行,而不能在另外两台具有相同框架版本的 PC 上运行?

【问题讨论】:

  • 融合日志中有什么?
  • 我看不到。在我的电脑上一切正常。
  • 也许你的 foreach 永远不会执行!检查路径,看看它是否真的有东西!
  • 是的。我在 LoadFrom 方法中使用 MessageBox 进行了检查
  • 使用 GetCurrentDirectory() 是一个非常糟糕的主意。最糟糕的全局变量,你无法控制它。您的应用在加载任意 DLL 时会崩溃。或者根本找不到。始终从已知目录中查找文件,相对于您的 EXE 文件。例如,Assembly.GetExecutingAssembly().Location 为您提供了一条不错的路径。

标签: c# .net .net-assembly


【解决方案1】:

使用上面的代码你无法知道是否有异常,因为你只捕获了ReflectionTypeLoadException类型的异常,添加另一个catch(Exception ex)

检查string[] paths 不为空。

检查这些程序集没有被其他进程使用。

检查您是否有权阅读这些程序集。

【讨论】:

    【解决方案2】:

    您还必须考虑其他类型的可能异常:

    try
    {
        // Ignore assemblies we can't load. They could be native, etc...
       Assembly.LoadFrom(assemblyFile);
    }
    catch (Win32Exception) { }
    catch (ArgumentException) { }
    catch (FileNotFoundException) { }
    catch (PathTooLongException) { }
    catch (BadImageFormatException) { }
    catch (SecurityException) { }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多