Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行已解压缩的控制台应用程序时出现BadImageFormatException错误_C#_.net_.net Core_Zip - Fatal编程技术网

C# 运行已解压缩的控制台应用程序时出现BadImageFormatException错误

C# 运行已解压缩的控制台应用程序时出现BadImageFormatException错误,c#,.net,.net-core,zip,C#,.net,.net Core,Zip,我开发的windows服务和控制台应用程序有一个非常奇怪的问题。windows服务是用c#.net内核编写的。它的作用是,它需要一个预先构建的.net核心控制台应用程序的zip文件,然后将其解压缩到一个位置,然后调用Process。开始运行它 有多个线程调用该服务,该服务将解压文件(如果尚未解压),然后为每个请求线程调用Process.Start。解压是线程安全的 有时,当控制台应用程序启动时,会在随机dll上发生BadImageFormatException崩溃。对process start的

我开发的windows服务和控制台应用程序有一个非常奇怪的问题。windows服务是用c#.net内核编写的。它的作用是,它需要一个预先构建的.net核心控制台应用程序的zip文件,然后将其解压缩到一个位置,然后调用Process。开始运行它

有多个线程调用该服务,该服务将解压文件(如果尚未解压),然后为每个请求线程调用Process.Start。解压是线程安全的

有时,当控制台应用程序启动时,会在随机dll上发生BadImageFormatException崩溃。对process start的任何后续调用都将在同一dll上崩溃,并出现相同的错误

如果我停止服务并手动运行console应用程序,它将崩溃,并出现相同的BadImageFormatException错误

现在是这样了,如果它变得奇怪了。如果我将console应用所在的文件夹复制到同一台机器上同一驱动器上的另一个位置并运行它,它将正常工作

如果我将包含BadImageFormatException的dll从原始文件夹复制到临时文件夹,请删除原始dll,然后将备份复制回原始文件夹并重新运行应用程序-它正常工作

我一直在努力找出背后的原因。如果某个.net core控制台应用程序只需将其复制到另一个文件夹即可在同一台计算机上运行,那么是什么原因导致该应用程序出现BadImageFormatException

从2012年r2到2016年,我在多台windows服务器上看到了这一点

更新

因此,从更多的测试来看,每当我运行控制台应用程序时,我都可以通过使用sysinternal中的RAMMap清除windows文件缓存,使BadImageFormatException再次工作

所以现在的问题是,为什么DLL在文件缓存中被修改或损坏?我一次启动多个进程(一次最多可以启动40个进程),但这不应导致修改dll并引发BadImageFormatException。是不是有什么阻碍了NetCore的负载?还是我解压文件夹的方式?我正在使用System.IO.Compression zip库,例如:

ZipFile.ExtractToDirectory(zipFile, outFolder);

看起来dll已经损坏,你是如何证明“线程安全”部分的,你还排除了64位库在32位系统下运行的可能性吗?可能是@TheGeneral的相关或重复的双重检查线程安全解压。即使dll已损坏,将其复制到另一个文件夹如何修复损坏?@bradbury9与64/32位无关,因为它都是64位的,无论如何,我说如果我将文件夹复制到同一台机器上的另一个位置,它可以运行。dll似乎已损坏,您如何证明“线程安全”部分,您还排除了64位库在32位系统下运行的可能性吗?可能与@TheGeneral双重检查线程安全解压相关或重复。即使dll已损坏,将其复制到另一个文件夹如何修复损坏?@bradbury9与64/32位无关,因为它都是64位的,无论如何,我说过,如果我将文件夹复制到同一台机器上的另一个位置,它可以运行。