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

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

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

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

当我在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="msil" type="win32" /> 

processorArchitecture应该是x86。

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

有人可以帮忙吗?

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

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

我希望这有助于其他人,我几个月来一直在打破和关闭这个问题。

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

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

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

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

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