c# - ClickOnce:在 64 位 Windows 上运行 x86 程序包时出现 BadImageFormatException

标签 c# .net visual-studio-2008 clickonce badimageformatexception

我的 .NET 2.0 应用程序导入非托管 32 位 dll。 当用户通过应用程序内的对话框打开文件时,将加载 dll(发生第一次互操作调用)。

当我使用目标平台“Any”通过 clickonce 部署应用程序时,64 位 Windows 上的用户在尝试从应用程序打开文件时收到 BadImageFormatException(此时已加载非托管 dll)。我知道这是由于 64 位进程和 32 位非托管 dll 的位数不兼容。

我已经使用 x86 作为目标平台重新部署了应用程序。据我了解,这应该可以解决位数问题。

但是

当我在 64 位系统上运行为 x86 构建的 已部署 应用程序时,我现在甚至在应用程序启动之前立即收到 BadImageFormatException。在至少三台 64 位机器上测试。在 32 位机器上,它可以正常工作。

当我从 VS 直接运行应用程序时(或不直接,只是正常构建,不通过 ClickOnce),使用 x86 目标平台时在 64 位窗口上没有问题。应用程序启动,用户可以加载文件 - 互操作调用成功。

我已经连续调试了 2 天但没有结果 - 我已经在不同的计算机上尝试过。它似乎始终在我试过的其中一台计算机上工作。但是,我没有永久访问这台计算机的权限。

我已经成功地在我的计算机上构建了一次 ClickOnce 部署,它在 64 位机器上运行。这可能是 100 次尝试中的一次!什么都没有改变,唯一改变的变量是我在计算机重启后立即成功构建。

我多次清理/重建/重启 VS/重启 Windows。我已经重新安装了 VS 2008,现在还安装了整个操作系统,但没有帮助。


编辑:我刚刚设法获得一个良好的构建(在接下来的 100 个 :) 中)并在部署的目录之间进行了比较。 问题的根源是 ClickOnce 在 main .exe 的 list 中生成了错误的目标平台:

<asmv1:assemblyIdentity name="app.exe" version="1.0.4.18" publicKeyToken=".token here." language="neutral" processorArchitecture="<b>msil</b>" type="win32" />

processorArchitecture 应该是 x86。

所以问题是如何在部署时始终如一地强制 VS 在 list 中生成正确的 processorArchitecture。

有人可以帮忙吗?

最佳答案

通过在 64 位 Windows 7 上安装 VS 2008 SP1 解决了这个问题。XP 上的 VS2008 SP1 在我试过的两台机器上都有问题。

关于c# - ClickOnce:在 64 位 Windows 上运行 x86 程序包时出现 BadImageFormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1631483/

相关文章:

c# - 为什么我需要将锁与信号量一起使用

c# - .NET:打开嵌入在资源文件中的文件

.net - .NET 的 AMQP V1.0 客户端

c++ - CString 错误, 'CString' : is not a member of 'ATL::CStringT<BaseType, StringTraits>'

c# - Windows.Forms Application.Run() 中无法追踪的异常

c# - 如何更改 WPF 中 gridViewColumn 的文本颜色?

c# - 为什么 "lock" block 不起作用?

c# - 通过 HTTPS 增量处理大型 XML 文件?

asp.net - "Could not reformat the document"在 ASP.NET, VS2008

c# - 将字符串拆分为 2 个数组的有效方法是什么