5

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

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

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

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

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

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

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

我做了很多次清理/重建/重新启动VS/重新启动窗口。我已经重新安装了 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" />

处理器架构应该是 x86。

所以问题是如何在部署时始终强制 VS 在清单中生成正确的处理器架构。

有人可以帮忙吗?

4

6 回答 6

3

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

于 2009-10-28T07:16:18.383 回答
1

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

我希望这对其他人有所帮助,几个月来我一直在与这个问题作斗争。

于 2011-05-04T07:12:19.523 回答
0

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

于 2009-10-27T15:20:56.260 回答
0

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

于 2012-10-17T06:01:19.647 回答
0

有时 ClickOnce 发布过程似乎会缓存以前 Any CPU 或 x64 版本的旧文件。进行清理并重建全部并没有为我解决这个问题。我需要从我的项目中删除所有 bin 和 obj 文件夹并重新打开 Visual Studio。

于 2013-02-11T22:21:40.423 回答
0

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

我们可以通过删除C:\Users\<user>\AppData\Local\AppsClickOnce 部署应用程序的子目录来解决问题。在我们的例子中,这是C:\Users\<user>\AppData\Local\Apps\2.0.

于 2016-10-18T01:18:00.257 回答