【问题标题】:How to deploy 64-bit version of DLL on Azure, but use the 32-bit version on dev boxes如何在 Azure 上部署 64 位版本的 DLL,但在开发盒上使用 32 位版本
【发布时间】:2011-11-17 13:56:26
【问题描述】:

我和我的业务合作伙伴正在共同开发一个部署在 Azure 上的网络应用程序。我的盒子基于 64 位 Windows 7,但我的伙伴使用的是 32 位 Windows 7

在 VS2010 IDE 中,当我从我的 System32 目录(我的盒子上是 64 位)添加对“ieframe.dll”的引用时,IDE 实际上带来了 SysWoW64(32 位) 版本的 DLL。

两个开发框都可以完美地与 32 位 WOW 版本的“ieframe.dll”配合使用,但是当我们部署到 Azure 时,我们会在制作时遇到 EntryPointNotFoundException对“ieframe.dll”的 Interop/DllImport 调用。因此,Azure 似乎想要拥有 64 位版本。

我们如何将 64 位版本部署到 Azure,但在我们的开发盒上继续使用 32 位版本?

编辑:显然,我们可以通过在某处复制 64 位“ieframe.dll”然后手动将其放置在“bin”目录中来手动执行此操作,但是在 Azure 中是否有更好的最佳实践方法来执行此操作?

编辑 #2:对于这种情况,我们最终将 Azure 的节点从 osFamily="1" 更改为 osFamily="2"。这样做会安装包含 IE8(而不是 Windows Server 2008 SP1 中的 IE7)的 Windows Server 2008 R2。无需混淆 32 位和 64 位版本或手动将 DLL 复制到服务器。

【问题讨论】:

    标签: azure 64-bit dllimport 32-bit


    【解决方案1】:

    如果您始终从 64 位计算机部署到 Azure,您可以根据执行构建的计算机的处理器类型,更改项目文件以在构建时将正确的 DLL 复制到 bin 文件夹。这对我们非常有用,因为我们从 64 位构建服务器部署到 Azure。如果这听起来不错,请按照以下步骤操作:

    1 - 创建一个外部 lib 文件夹,其中包含名为 32 和 64 的两个子文件夹。
    2 - 将32位版本的DLL放在32文件夹,64位版本放在64文件夹。
    3 - 在文本编辑器中打开有问题的项目文件。
    4 - 将以下节点添加到项目文件中,就在包含“引用包含”项的 ItemGroup 之后。这将根据系统提供的环境变量复制正确的 DLL:

    <ItemGroup>
        <DllToCopy Condition=" '$(PROCESSOR_ARCHITECTURE)' == 'x86' And '$(PROCESSOR_ARCHITEW6432)' == '' " Include="..\ext-lib\32\mydll.dll" />
        <DllToCopy Condition=" '$(PROCESSOR_ARCHITECTURE)' == 'AMD64' Or '$(PROCESSOR_ARCHITEW6432)' == 'AMD64' " Include="..\ext-lib\64\mydll.dll" />
    </ItemGroup>
    

    5 - 最后,像这样改变项目的 BeforeBuild 目标:

    <Target Name="BeforeBuild">
        <Copy SourceFiles="@(DllToCopy)" DestinationFolder="$(OutputPath)" />
    </Target>
    

    另一种选择是根据构建配置将正确的 DLL 复制到 bin 文件夹(不太理想)。例如,如果您有一个名为 Production 的构建配置,您将按照上述步骤操作,但第 4 步将包含以下内容:

    <ItemGroup>
        <DllToCopy Condition=" '$(Configuration)' != 'Production' " Include="..\ext-lib\32\mydll.dll" />
        <DllToCopy Condition=" '$(Configuration)' == 'Production' Include="..\ext-lib\64\mydll.dll" />
    </ItemGroup>
    

    另一个(甚至更不理想)选项是使用 Azure 启动任务将 DLL 的 64 位版本复制到 bin 文件夹。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的详细回复。我和我的联合创始人考虑了您提供的所有反馈。最后,他硬着头皮决定升级到 64 位机器,配备 64 位操作系统,这样他、我和 Azure 都将使用相同的 64 位架构。以前,他将所有新位从他的 32 位机器部署到 Azure。在我们遇到上面提到的 ieframe.dll 依赖问题之前,这一直很好。我们讨厌必须支持多种配置,所以是时候让他“Man Up”到一个新盒子了!
    • 顺便说一句:使用 Azure 启动任务是解决我们困境的最常见建议解决方法,但正如您所指出的,在所有“修复”中,它是最丑陋的。再次感谢您的反馈。如果由于某种原因,我们有另一个开发人员与 32 位开发机器结合,那么很高兴知道如何做到这一点。
    • 请参阅上面的编辑#2,了解我们最终使用的解决方案。
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2012-03-17
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多