在64位窗口上运行x86包时,ClickOnce:BadImageFormatException

时间:2009-10-27 15:11:46

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

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

当我使用目标平台“Any”通过clickonce部署应用程序时,64位窗口上的用户在尝试从应用程序打开文件时(在加载非托管dll时)会收到BadImageFormatException。我理解这是由于64位进程和32位非托管dll的不可比特的比特。

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

BUT

当我在64位系统上运行为x86构建的部署的应用程序时,我现在在应用程序启动之前立即获得BadImageFormatException。至少测试了三台64位机器。在32位机器上,它没有问题。

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

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

我已经设法在我的计算机上构建了一次ClickOnce部署,它可以在64位计算机上运行。这可能只有100次尝试!没有任何改变,唯一改变的变量是我在计算机重启后立即成功构建。

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


编辑:我刚刚设法获得了一个良好的构建(下一个100 :) :)并在部署的目录之间进行了比较。 问题的根源是ClickOnce在主.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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我也有这个问题,使用VS2008 SP1。 在我的情况下,我有一个32位DLL,必须编译为32位和一个在同一解决方案中使用它的应用程序。 即使我将X86指定为发布版本的构建目标,当我发布64位应用程序时,编译并包含在安装程序中。 我找到了一个稍微残酷的解决方案: 进入配置管理器并删除除了您要构建的配置(调试版和发行版)之外的所有可能配置。 执行此操作后,我发现clickonce安装程序是使用正确的应用程序生成的。

我希望这有助于其他人,我几个月来一直在和这个问题作斗争。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

我们只需删除ClickOnce部署应用程序的C:\Users\<user>\AppData\Local\Apps子目录即可解决问题。在我们的例子中,这是C:\Users\<user>\AppData\Local\Apps\2.0