我的 .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 在清单中生成正确的处理器架构。
有人可以帮忙吗?