【发布时间】:2010-12-10 12:42:51
【问题描述】:
我的 .NET 2.0 应用程序导入非托管 32 位 dll。 当用户通过应用程序中的对话框打开文件时,会加载 dll(发生第一次互操作调用)。
当我通过 clickonce 使用目标平台“Any”部署应用程序时,64 位 Windows 上的用户在尝试从应用程序打开文件时会收到 BadImageFormatException(此时加载了非托管 dll)。我知道这是由于 64 位进程和 32 位非托管 dll 的位数不兼容。
我已经使用 x86 作为目标平台重新部署了应用程序。据我了解,这应该可以解决位数问题。
但是
当我在 64 位系统上运行为 x86 构建的 deployed 应用程序时,我现在在应用程序启动之前立即收到 BadImageFormatException。在至少三台 64 位机器上测试。在 32 位机器上,它可以正常工作。
当我直接从 VS 运行应用程序时(或者不直接运行,只是正常构建,不通过 ClickOnce),使用 x86 目标平台时在 64 位窗口上没有问题。应用程序启动,用户可以加载文件 - 互操作调用成功。
我已经连续调试了 2 天,但没有任何结果 - 我在不同的计算机上尝试过。它似乎始终可以在我尝试过的一台计算机上运行。但是,我没有永久访问这台计算机的权限。
我曾经设法在我的计算机上构建 ClickOnce 部署,它在 64 位计算机上运行。这可能是 100 次尝试中的一个!什么都没有改变,唯一改变的变量是我在计算机重启后立即成功构建。
我多次清理/重建/重新启动 VS/重新启动 Windows。我已经重新安装了 VS 2008,现在还重新安装了整个操作系统,但没有帮助。
编辑:我刚刚设法获得了一个好的构建(接下来的 100 个:))并在部署的目录之间进行了比较。 问题的根源是ClickOnce在main.exe的manifest中生成了错误的目标平台:
<asmv1:assemblyIdentity name="app.exe" version="1.0.4.18" publicKeyToken=".token here." language="neutral" processorArchitecture="<b>msil</b>" type="win32" />
处理器架构应该是 x86。
所以问题是如何在部署时始终强制 VS 在清单中生成正确的处理器架构。
有人可以帮忙吗?
【问题讨论】:
-
我可以确认这个问题。即使应用程序构建为 x86(通过 CorFlags 确认),发布过程(即使用 ClickOnce)也可以将其更改为 Any CPU(再次通过 CorFlags 确认)。但是,当发布过程开始时,它确实会在输出窗口中显示“配置:调试任何 CPU”(此消息在该过程中稍后会被清除)。
标签: c# .net visual-studio-2008 clickonce badimageformatexception