我创建了在IIS下运行的Web服务,它是x64位的。我在 Azure 机器 (ws2008 r2) 上使用自定义安装脚本部署了它。我创建了自定义应用池(64 位,托管管道模式:经典,.net v2,网络服务帐户作为服务用户)。一切似乎都配置正确,但是当我尝试运行我的应用程序时,出现以下错误:
System.TypeInitializationException:'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' 的类型初始值设定项抛出异常。 ---> System.TypeInitializationException:'' 的类型初始值设定项引发异常。 ---> .模块加载异常:C++模块在尝试初始化默认应用程序域时加载失败。
我可以运行独立的 win 表单应用程序,并且此方法工作正常。更重要的是,当我将应用程序池切换到 32 位并运行我的应用程序时,它失败了(因为它有 x64 位组件),但是后来当切换回 x64 时它工作正常,RoleEnvironment 返回正确的数据。
您是否知道在配置方面我会做错什么,因此此模块无法以x64位版本加载?
这可能会有所帮助。您可以将启动任务添加到 Windows Azure 项目的 .csdef 文件中,以将 IIS 配置为允许 64 位应用程序中的 32 位模块。
在您的 Windows Azure 项目 .csdef 文件中:
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition>
<WebRole ...>
...
<Startup>
<Task commandLine="ConfigureIIS.cmd" executionContext="elevated" taskType="simple" />
</Startup>
</WebRole>
</ServiceDefinition>
ConfigureIIS.cmd(全部一行):
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.enable32BitAppOnWin64:true
你需要通过启动任务在 Azure VM 中安装 VC++ x64 运行时,因为你使用的某些引用需要 VC++ 运行时。