Arm*_*nco 6 64-bit 32-bit dllimport azure
我的业务合作伙伴和我共同开发了一个部署在Azure上的Web应用程序.我的盒子基于64位Windows 7,但我的合作伙伴使用的是32位Windows 7.
当我从我的System32目录(我的盒子上的64位)添加对'ieframe.dll'的引用时,在VS2010 IDE中,IDE实际上带来了DLL 的SysWoW64(32位)版本.
两个开发框都与32位WOW版本的' ieframe.dll ' 完美配合,但是当我们部署到Azure时,我们在对' ieframe.dll ' 进行Interop/DllImport调用时会得到一个EntryPointNotFoundException.所以看起来Azure想拥有64位版本.
我们如何将64位版本部署到Azure,但在我们的开发盒上继续使用32位版本?
编辑:显然,我们可以通过在某处复制64位'ieframe.dll'手动执行此操作,然后手动将其放在'bin'目录中,但有没有更好的最佳实践方法在Azure中执行此操作?
编辑#2:对于这种情况,我们最终将osFamily ="1"的Azure节点更改为osFamily ="2".这样做会安装包含IE8的Windows Server 2008 R2(而不是Windows Server 2008 SP1中的IE7).无需混淆32位与64位版本或手动将DLL复制到服务器.
如果始终从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>
Run Code Online (Sandbox Code Playgroud)
5 - 最后,改变项目的BeforeBuild目标,如下所示:
<Target Name="BeforeBuild">
<Copy SourceFiles="@(DllToCopy)" DestinationFolder="$(OutputPath)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
另一种选择是根据构建配置将不正确的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>
Run Code Online (Sandbox Code Playgroud)
另一个(甚至更不理想的)选项是使用Azure启动任务将64位版本的DLL复制到bin文件夹.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
1766 次 |
| 最近记录: |