加载嵌入式DLL时抛出System.ExecutionEngineException

时间:2015-04-21 12:02:45

标签: c# .net dll

客户报告了一个问题,其中一个程序在尝试运行时会崩溃。他们提供了崩溃期间生成的转储文件。转储文件显示问题是当我提取嵌入为程序中的资源的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]。

1 个答案:

答案 0 :(得分:0)

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

仅供参考,这似乎并不局限于特定的语言。