System.BadImageFormatException:无法加载文件或程序集(来自 installutil.exe)
Posted
技术标签:
【中文标题】System.BadImageFormatException:无法加载文件或程序集(来自 installutil.exe)【英文标题】:System.BadImageFormatException: Could not load file or assembly (from installutil.exe) 【发布时间】:2010-09-24 07:13:42 【问题描述】:我正在尝试使用 InstallUtil.exe 安装 Windows 服务并收到错误消息
System.BadImageFormatException:无法加载文件或程序集“
xxx.exe
”或其依赖项之一。试图加载格式不正确的程序。
什么给了?
编辑:(不是由 OP)从 dup 中提取的完整消息获得更多点击 [for googleability]:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>InstallUtil.exe C:\xxx.exe Microsoft (R) .NET Framework 安装实用程序版本 4.0.30319.1 版权所有 (c) 微软公司。保留所有权利。
初始化安装时发生异常: System.BadImageFormatException:无法加载文件或程序集“file:///C:\xxx.exe”或其依赖项之一。试图加载格式不正确的程序..
【问题讨论】:
【参考方案1】:更多细节以确保对某人有帮助...
请注意,最近出现此异常的最常见原因是尝试将 32 位特定 (/platform:x86
) DLL 加载到 64 位进程中,反之亦然(即加载 64 位特定 (@ 987654326@) DLL 到 32 位进程中)。如果您的 platform
是非特定的 (/platform:AnyCpu
),则不会出现这种情况(假设没有引用的依赖项是错误的位数)。
换句话说,运行:
%windir%\Microsoft.NET\Framework\v2.0.50727\installutil.exe
或:
%windir%\Microsoft.NET\Framework64\v2.0.50727\installutil.exe
将不起作用(替换为其他框架版本:v1.1.4322
(仅限 32 位,因此不会出现此问题)和v4.0.30319
,如上文所述)。
显然,正如另一个答案所涵盖的那样,您还需要您正在运行的installutil
的 .NET 版本号 >=(最好是 =)您正在运行的安装程序的 EXE/DLL 文件的版本号.
最后,请注意in Visual Studio 2010, the tooling will default to generating x86 binaries (rather than Any CPU as previously)。
Complete details of System.BadImageFormatException(说唯一的原因是不匹配的咬痕实在是过于简单化了!)。
x64 安装程序下BadImageFormatException
的另一个原因是in Visual Studio 2010, the default .vdproj
Install Project type generates a 32-bit InstallUtilLib
shim, even on an x64 system(在页面上搜索“64 位托管自定义操作引发 System.BadImageFormatException 异常”)。
【讨论】:
我有同样的问题,当我按照你上面说的开始调试时,我发现 Platform: 设置为 x86。当我将它更改为任何 CPU 时,它工作了:) 我的 Windows 安装程序带有自定义操作。我的设置需要在 x64 系统上运行,因此自定义操作属性必须检查选项“Run64Bit”是否为真。它解决了我的问题。【参考方案2】:确保最新的框架(您编译应用时使用的框架)位于 PATH 的第一位。这为我解决了问题。 (发现on a forum)
【讨论】:
那个链接好像没了。不过也不算太意外。 6 年前。 这里是 Archive.org web.archive.org/web/20100527204545/http://www.issociate.de/… 我希望如果他们向我们展示他们设置的 PATH 会更好。从过去的 2 小时开始,我一直在努力解决这个问题...【参考方案3】:关键是在两个地方为项目设置匹配处理器设置。
并确保架构设置在测试菜单>>测试设置>>默认处理器架构>>中相同,如下所示。
这适用于 VS2013,但可能也适用于其他版本。
更新 - 对于 VS2019:
【讨论】:
这是修复此错误的正确方法。也就是说,如果您不想弄乱可能有数百个 csproj 文件。【参考方案4】:我认为您正在使用该工具的 64 位版本来安装 32 位应用程序。 我今天也遇到了这个问题,并使用了这个框架路径来迎合。
C:\Windows\Microsoft.NET\Framework\v4.0.30319
它应该可以安装您的 32 位应用程序。
【讨论】:
对我来说就是这样。很有帮助的答案。 至少链接原答案:***.com/revisions/5229405/1【参考方案5】:好的,这就是我遇到的问题,修复它的方法似乎与上述非常相关。
我正在使用 Visual Studio 2010 Express。我写了一个测试服务,它并没有真正做任何事情。这只是后来的真实事物的练习。
我编写了服务并尝试使用installutil.exe
安装它并收到以下错误:
System.BadImageFormatException:无法加载文件或程序集“filename.exe”或其依赖项之一。试图加载格式不正确的程序。
到目前为止与原作者相同。
Ruben's observation 以上关于 Visual Studio 2010 的 32 位输出是这里的救星。
我使用了 64 位版本的 installutil.exe
,果然,Visual Studio 2010 构建的输出是 32 位的。在这里添加一点额外的价值,您可以在 C:\Windows\Microsoft.NET\framework 文件夹中找到最新的 .NET 框架的 32 位版本和关联的installutil.exe
。使用这个版本的installutil.exe
解决了我的问题;服务安装顺利!
我希望这对其他人有所帮助。
【讨论】:
我不知道您所说的 32 位版本是什么意思,但我在这里尝试过,它也不起作用 C:\Windows\Microsoft.NET\Framework\v2.0.50727跨度> 【参考方案6】:我在使用 VS 2015 的 WinForms 项目中遇到了这个问题。我的解决方案是:
-
右键单击项目
选择属性
勾选“首选 32 位”
平台目标:任何 CPU
【讨论】:
【参考方案7】:在尝试了所有提到的解决方案后,我发现 PlatformTarget
以某种方式添加到我的项目 .csproj 中的 AnyCPU
配置中。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
删除线对我有用。
【讨论】:
在我想要 64 位构建的情况下,PropertyGroup 节点之一缺少Processor Architecture for AnyCPU Projects
) 之后,一切又开始工作了。
谢谢你,我在“属性”窗口中将它设置为 x86,但是当我查看 csproj 文件时,它是 AnyCPU。将其切换到 x86 解决了我的问题【参考方案8】:
在我的例子中,我使用了如下所示的 Framework64
cd\
cd "C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
installutil.exe "C:\XXX\Bin\ABC.exe"
pause
【讨论】:
【参考方案9】:我今天遇到了这个问题。就我而言,我的应用程序的 (引用了 64 位 dll) 平台目标设置为 AnyCPU
但平台目标部分下的 Prefer 32-bit
复选框 是默认勾选。这就是问题所在,在取消选中 Prefer 32-bit
选项后一切正常。
【讨论】:
【参考方案10】:我有同样的问题。我使用标准命令执行。它正在调用 X64 ro 针对 X86 测试运行。我需要指定 nunit-runner 的 X86 而不是 X64 版本。
【讨论】:
【参考方案11】:总之,必须将 Build 和 Project\Build\Platform 都设置为 x64 才能在 64 位系统上成功安装 64 位服务。
【讨论】:
【参考方案12】:我的问题不同。这发生在我的 Windows 7 机器意外关闭之后。我执行了一个干净的解决方案,它按预期运行。
【讨论】:
【参考方案13】:如果在实时测试中出现此消息,但在单元测试中没有,这是因为选定的程序集被即时复制到$(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\
。但有时可能不选择少数程序集,例如,在互操作 c++/c# 项目的情况下,VC++ dll。
构建后xcopy
不会纠正问题,因为复制的文件将被实时测试引擎删除。
迄今为止(2018 年 12 月 28 日)唯一的解决方法是避免实时测试,并在单元测试中使用属性 [TestCategory("SkipWhenLiveUnitTesting")]
应用于测试类或测试方法来执行所有操作。
此错误出现在任何 Visual Studio 2017 至 15.9.4 中,需要由 Visual Studio 团队解决。
【讨论】:
【参考方案14】:目标构建 x64 目标服务器托管 IIS 64 位
右键单击运行网站/Web 应用程序的 appPool 托管并设置 启用 32 位应用程序 = false。
【讨论】:
【参考方案15】:对于具有相同症状的问题,我们找到了不同的解决方案:
当我们将项目从 .net 4.7.1 更新到 4.7.2 时,我们看到了这个错误。
问题在于,即使我们在项目中不再引用 System.Net.Http,它仍然列在 web.config 的dependentAssembily 部分中。从 web.config 中删除这个和任何其他未使用的程序集引用解决了这个问题。
【讨论】:
【参考方案16】:问题是每个System.BadImageFormatException: Could not load file or assembly
包括那些与installutil.exe
无关的都指向这个线程。
如果您的问题与WindowsBase
或PresentationFramework
有关
dll 并且您安装了分析器,请确保安装它们
为您解决方案中的所有项目安装或没有安装
他们。
在您的库的.csproj
文件中引用整个框架,而不仅仅是两个dlls
:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<RazorLangVersion>3.0</RazorLangVersion>
<UseWpf>True</UseWpf>
</PropertyGroup>
删除 bin
和 obj
目录,清理解决方案并重建。
【讨论】:
以上是关于System.BadImageFormatException:无法加载文件或程序集(来自 installutil.exe)的主要内容,如果未能解决你的问题,请参考以下文章