无法加载文件或程序集 X 或其依赖项之一。不是有效的Win32应用程序。 (HRESULT:0x800700C1)

Posted

技术标签:

【中文标题】无法加载文件或程序集 X 或其依赖项之一。不是有效的Win32应用程序。 (HRESULT:0x800700C1)【英文标题】:Could not load file or assembly X or one of its dependencies. is not a valid Win32 application. (HRESULT: 0x800700C1) 【发布时间】:2014-10-12 10:30:09 【问题描述】:

操作系统:Windows 8.1 64

我尝试使用 DirectX 在 VB.Net 中播放多个声音,我的代码中没有错误。 问题是每当触发事件时,我都会收到此错误

System.BadImageFormatException 未处理 消息:未处理 “System.BadImageFormatException”类型的异常发生在 System.Windows.Forms.dll 附加信息:无法加载文件 或程序集“Microsoft.DirectX.AudioVideoPlayback.dll”或其之一 依赖关系。不是有效的Win32应用程序。 (例外来自 HRESULT: 0x800700C1)

然后我将 Target CPU 设置为 x86,我得到了这个错误

System.IO.FileLoadException 未处理 消息:未处理 “System.IO.FileLoadException”类型的异常发生在 System.Windows.Forms.dll 附加信息:混合模式程序集 是针对运行时的“v1.1.4322”版本构建的,不能 在 4.0 运行时加载,无需额外配置 信息。

到目前为止,我已经尝试卸载-重新安装 DirectX SDK,安装与 DirectX 和不同声音文件 (.wav) 有关的所有内容。 此外,我必须浏览加载 .dll,在 Reference Manager>Assemblies 下找不到它们,但现在我什至无法通过浏览加载它们,所以我使用 Imports Microsoft.DirectX.AudioVideoPlayback 它会让我导入其余的 .dll,除了(参考管理器甚至不会打开它们):

Microsoft.DirectX.AudioVideoPlayback.dll
Microsoft.DirectX.dll
Microsoft.DirectX.DirectSound.dll

我需要的那些。有没有办法清理重新安装它们?

目标框架:.Net Framework 4.5

代码:

Dim MySound1 As New Microsoft.DirectX.AudioVideoPlayback.Audio("D:\path\sound_file.mp3")

MySound1.Play()

如果您还需要了解其他信息,请告诉我。

更新: 我将Target Framework 更改为.Net Framework 3.5,它工作正常,但前提是CPU Target 设置为x86!这是为什么呢?

【问题讨论】:

对我来说图像不好,可能是声音文件。您是否尝试使用其他声音文件。或者我尝试使用 .wav BadImageFormatException 通常是 32 位/64 位问题。您引用的 DirectX 库是否与您的应用程序相同? 尝试了一个 .wav 文件 - 没有工作。我将目标 CPU 设置为 x86,现在出现此错误:"System.IO.FileLoadException was unhandled Message: An unhandled exception of type 'System.IO.FileLoadException' occurred in System.Windows.Forms.dll附加信息:混合模式程序集是针对运行时版本“v1.1.4322”构建的,如果没有附加配置信息,则无法在 4.0 运行时中加载。” 我将Target Framework 更改为.Net Framework 3.5,它工作正常,但前提是CPU Target 设置为x86!这是为什么呢? 有关旧版托管 DirectX 1.1 程序集的状态和限制的详细信息,请参阅 this 帖子。 【参考方案1】:

您正在使用旧的 Managed DirectX 包装器。目标是在 .NET 1.1 上运行,这是一个从不支持 64 位代码的框架版本。这些包装器很久以前就被弃用了,2.0 版本从未退出测试版。

需要将 EXE 的平台目标更改为 x86,没有 64 位版本的托管 DirectX,并且 DLL 包含用托管 C++ 编写的本机 32 位代码。此外,如果您的目标是 .NET 4.0 或更高版本,那么您必须使用一个 .config 文件,该文件表明可以加载这样一个期望本机代码在 .NET 1.1 上良好运行的古老程序集。它应该是这样的:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

useLegacyV2RuntimeActivationPolicy 属性抑制了您收到的错误消息。它是否真的可以在 4.0+ 上运行还不是很清楚,没有人再使用这些包装器了。通常的建议是改用 SharpDX 或 SlimDX。

【讨论】:

.config 文件不起作用我收到另一个错误“HResult=-2146232799”关于混合程序集。我想我会切换到 SharpDX。谢谢。

以上是关于无法加载文件或程序集 X 或其依赖项之一。不是有效的Win32应用程序。 (HRESULT:0x800700C1)的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集 此处的程序集名称 或其依赖项之一。访问被拒绝

无法加载文件或程序集“CefSharp.dll”或其依赖项之一

无法加载文件或程序集“***.dll”或其依赖项之一

BadImageFormatException 无法加载文件或程序集或其依赖项之一。试图加载格式不正确的程序

无法加载文件或程序集“Oracle.ManagedDataAccessDTC.DLL”或其依赖项之一

无法加载文件或程序集“msshrtmi”或其依赖项之一(Azure 表存储访问)