代码之家  ›  专栏  ›  技术社区  ›  Marek

在64位Windows上运行x86包时ClickOnce:BadImageFormatException

  •  5
  • Marek  · 技术社区  · 15 年前

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

    当我使用目标平台“any”通过ClickOnce部署应用程序时,64位Windows上的用户在尝试从应用程序打开文件时(此时加载了非托管dll)会得到badImageFormatException。我理解这是由于64位进程和32位非托管DLL的不兼容位造成的。

    我已经重新部署了使用x86作为目标平台的应用程序。据我所知,这应该可以解决比特率问题。

    但是

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

    当我运行应用程序时 直接地 从vs(或者不直接,只是一个普通的构建,而不是通过clickOnce),使用x86目标平台时64位Windows没有问题。应用程序启动,用户可以加载文件-互操作调用成功。

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

    我曾经在我的计算机上构建过ClickOnce部署,它在64位计算机上工作。这是100次尝试中的一次!什么都没有改变,唯一改变的变量是我在计算机重新启动后立即成功地进行了构建。

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


    编辑:我刚刚获得了一个良好的构建(在接下来的100个中):并对部署的目录进行了比较。 问题的根源在于clickonce在main.exe的清单中生成了错误的目标平台:

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

    ProcessorArchitecture应为x86。

    因此,问题是如何在部署时一致地强制vs在清单中生成正确的processorArchitecture。

    有人能帮忙吗?

    6 回复  |  直到 8 年前
        1
  •  3
  •   Marek    15 年前

    这是通过在64位Windows7上安装VS 2008 SP1解决的。XP上的VS2008 SP1在我尝试使用的两台计算机上出现问题。

        2
  •  1
  •   Chris    13 年前

    我也有这个问题,使用VS2008 SP1。 在我的例子中,我有一个32位的DLL,它必须编译为32位,并且有一个应用程序在同一个解决方案中使用它。 尽管我指定x86作为发布版本的生成目标,但当我发布64位应用程序时,它被编译并包含在安装程序中。 我找到了一个稍微残酷的解决方案: 进入配置管理器并删除所有可能的配置,除了您希望它构建的配置(调试和发布版本)。 这样做之后,我发现ClickOnce安装程序是用正确的应用程序生成的。

    我希望这能帮助别人,我已经断断续续地解决这个问题好几个月了。

        3
  •  0
  •   Nestor    15 年前

    我建议使用 Reflector 要打开ClickOnce部署的主exe并查看依赖项,以确保您没有错误地部署64位版本的dll。

        4
  •  0
  •   Anastacia    12 年前

    必须解析为在IIS 7中运行32位应用程序。见 http://www.fishofprey.com/2009/04/badimageformatexception-in-iis-70-on-64.html

        5
  •  0
  •   LucasMcGraw    11 年前

    有时,ClickOnce发布过程似乎缓存以前任何CPU或X64版本中的旧文件。做一次清理和重建并不能解决这个问题。我需要从项目中删除所有bin和obj文件夹,然后重新打开Visual Studio。

        6
  •  0
  •   Jan Hettich    8 年前

    我们遇到了这个问题,并确定ClickOnce部署应用程序的用户配置文件的子目录一定已损坏,因为当我们在同一台计算机上以不同的用户身份登录时,可以使用ClickOnce成功部署应用程序。

    我们只需删除 C:\Users\<user>\AppData\Local\Apps ClickOnce在其下部署我们的应用程序。在我们的案例中,这是 C:\Users\<user>\AppData\Local\Apps\2.0 .

    推荐文章