加载嵌入式 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的主要内容,如果未能解决你的问题,请参考以下文章
即使使用全新的 Anaconda 安装,使用依赖于 scipy 的包也会引发 ImportError(DLL 加载失败)
使用 AppDomain 将 DLL 作为嵌入式资源文件加载