加载嵌入式 DLL 时引发 System.ExecutionEngineException

Posted

技术标签:

【中文标题】加载嵌入式 DLL 时引发 System.ExecutionEngineException【英文标题】:System.ExecutionEngineException thrown when loading embedded DLL 【发布时间】:2015-04-21 12:02:44 【问题描述】:

一位客户报告了我的一个程序在尝试运行时崩溃的问题。他们提供了崩溃期间生成的转储文件。转储文件显示问题是在我提取作为资源嵌入到程序中的 DLL 时引发了 System.ExecutionEngineException。

有问题的代码是:

public FrontEnd()

    AppDomain.CurrentDomain.AssemblyResolve += (sender, args2) =>
    
        var resourceName = new AssemblyName(args2.Name).Name + ".dll";
        var resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName, StringComparison.CurrentCulture));

        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource))
        
            var assemblyData = new byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
            return Assembly.Load(assemblyData);
        
    ;

    this.InitializeComponent();

我正在使用this website 中描述的方法,并且到目前为止没有遇到任何问题。

GetManifestResourceStream() 行中抛出异常。

有关信息,此代码已在世界各地的许多 PC 上运行了几个月,但不适用于此客户。

在管理员模式下运行程序没有任何区别。

程序和 DLL 都是用 C# (4.0) 编写的。

我已尝试按照this *** post 中的建议禁用并发垃圾回收。

我的一位同事要求客户尝试使用相同技术的另一个程序,但它遇到了同样的问题。

我现在通过注释掉这段代码来解决这个问题。但我想知道:为什么会这样?我该如何正确修复它?有没有更好的方法来嵌入 DLL? [仅供参考,在几个客户在复制程序时遇到问题并忘记复制当时单独的 DLL 后,我开始这样做]。

【问题讨论】:

这篇文章在这里试图总结some of the causes。除了早期 .Net Framework 中的错误(应该通过补丁很好地修复)之外,这通常发生在具有不良行为的非托管 (PInvoke / COM) 代码的接口处。 像这样的孤立故障不是您的问题,客户需要重新映像他的机器。你最好花时间为你的程序创建一个合适的安装程序,我会说。 谢谢@StuartLC。这实际上是我从问题中链接到的帖子,所以我看过它,但没有设法确定我的案例的根本原因。 @HansPassant:自从我发布这个问题以来,另外两个客户实际上也发生了同样的事情。我不知道这怎么可能已经休眠了几个月,然后在几天内突然被报告了好几次。无论如何,这是一件事,我必须处理它。您关于创建安装程序的建议绝对是我会考虑的,谢谢。 【参考方案1】:

答案似乎与@StuartLC 对.Net 框架的评论有关。这个问题已经发生了好几次,总是在运行非英文版 .Net 的 PC 上发生。当用户升级到 .Net 4.5.1 (https://www.microsoft.com/en-in/download/details.aspx?id=40779) 后问题就解决了。

仅供参考,这似乎不受特定语言的限制。

【讨论】:

以上是关于加载嵌入式 DLL 时引发 System.ExecutionEngineException的主要内容,如果未能解决你的问题,请参考以下文章

Windows 窗体嵌入式进度条后台工作者

即使使用全新的 Anaconda 安装,使用依赖于 scipy 的包也会引发 ImportError(DLL 加载失败)

使用 AppDomain 将 DLL 作为嵌入式资源文件加载

wpf对类型“xxx.MainWindow”的构造函数执行符合指定的绑定约束的调用时引发了异常

C#中如何动态加载和卸载DLL

TaskDialog 引发异常:需要版本 6 中的 comctl32.dll