如何在Azure上部署64位版本的DLL,但在dev Box上使用32位版本

如何在Azure上部署64位版本的DLL,但在dev Box上使用32位版本,azure,64-bit,dllimport,32-bit,Azure,64 Bit,Dllimport,32 Bit,我的业务伙伴和我正在共同开发一个部署在Azure上的web应用程序。我的盒子基于64位Windows 7,但我的合作伙伴使用的是32位Windows 7 在VS2010 IDE中,当我从System32目录(框中的64位)添加对“ieframe.dll”的引用时,IDE实际上带来了dll的SysWoW64(32位)版本 这两个开发框都能与32位WOW版本的“ieframe.dll”完美配合,但当我们部署到Azure时,在对“ieframe.dll”进行互操作/DllImport调用时,我们会得到

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

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

这两个开发框都能与32位WOW版本的“ieframe.dll”完美配合,但当我们部署到Azure时,在对“ieframe.dll”进行互操作/DllImport调用时,我们会得到一个EntryPointNotFoundException。所以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复制到服务器。

如果您总是从64位计算机部署到Azure,则可以根据执行生成的计算机的处理器类型更改项目文件,以便在生成时将正确的DLL复制到bin文件夹。这对我们来说非常有用,因为我们从64位构建服务器部署到Azure。如果这听起来是一个不错的解决方案,请遵循以下步骤:

1-创建一个包含两个子文件夹32和64的外部库文件夹。
2-将DLL的32位版本放在32文件夹中,将64位版本放在64文件夹中。
3-在文本编辑器中打开有问题的项目文件。
4-将以下节点添加到包含“引用包含”项的项目组之后的项目文件中。这将根据系统提供的环境变量复制正确的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-最后,更改项目的预构建目标,如下所示:

<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>


谢谢你的详细回复。我和我的联合创始人考虑了你提供的所有反馈。最后,他咬紧牙关,决定升级到带有64位操作系统的64位机器,这样他、我和Azure都将使用相同的64位体系结构。之前,他将所有新的位从32位机箱部署到Azure。在遇到我在上面提到的ieframe.dll依赖项问题之前,这一切都很好。我们讨厌必须支持多种配置,所以是时候让他“准备”一个新的盒子了!顺便说一下:使用Azure startup任务是解决我们困境的最常建议的解决方法,但正如您所指出的,在所有“修复”中,它是最丑陋的。再次感谢您的反馈。如果出于某种原因,我们有另一位开发人员与32位开发人员机器联姻,那么知道如何做到这一点很好。有关我们最终使用的解决方案,请参阅上面的编辑#2。