客户报告了一个问题,其中一个程序在尝试运行时会崩溃。他们提供了崩溃期间生成的转储文件。转储文件显示问题是当我提取嵌入为程序中的资源的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 stackoverflow post中的建议禁用并发垃圾回收。
我的一位同事要求客户尝试使用相同技术的其他程序,并且遇到了同样的问题。
我现在通过评论此代码解决了这个问题。但我想知道:为什么会发生这种情况?我该如何正确修复?有没有更好的方法来嵌入DLL? [仅供参考,我开始这样做之后,有几个客户在复制程序时遇到问题而忘记复制当时单独的DLL]。
答案 0 :(得分:0)
答案似乎与@StuartLC关于.Net框架的评论有关。此问题已发生多次,总是在运行非英文版.Net的PC上。当用户升级到.Net 4.5.1(https://www.microsoft.com/en-in/download/details.aspx?id=40779)时,问题就解决了。
仅供参考,这似乎并不局限于特定的语言。