《Windows Azure Platform 系列文章目录》
如果我们想把一个应用程序迁移到Winodows Azure平台上,还会遇到这样的问题:传统的Web Site往往使用了许多"老"的COM组件。这样是不是意味着我必须在每个Azure计算节点(Azure VM)上都手工注册一遍COM组件(比如远程桌面连接,然后regsvr32?,这样也太麻烦了吧...)其实Windows Azure提供了role start up功能,方便我们在云平台注册COM组件。
1.使用VS2010新建一个Windows Azure项目,并且添加一个Web Application(过程略)
2.假设我们有一个C++项目,能够生成名为LegacyCOM.dll,这个dll有一个方法叫做Greeting()。
具体调用是这样的:先实例化这个dll对象,然后调用Greeting方法,传入一串string进去,然后这个dll会返回一串string。
Azure Project会根据Web服务器的操作系统的版本来注册不同版本的LegacyCOM.dll,比如探测到服务器端64位的Win7操作系统,则会自动注册64位的LegacyCOM.dll。
3.我们在WebRole Solution里新建两个文件夹,分别叫"amd64"和"x86"。
4.将64位版本的LegacyCOM.dll复制"amd64"文件夹下,将32位版本的dll复制到"x86"文件夹下。
5.将这两个dll包含在VS项目里(include in project),并且将属性中的"Copy to Output Directory"设置成"Copy always"。
6.在Web Application工程下新建文件,文件夹设置成Register.cmd
7.Register.cmd的内容如下,主要的功能是在Azure VM上注册这个dll组件
echo off
regsvr32.exe /s "%~dp0%PROCESSOR_ARCHITECTURE%\LegacyCOM.dll"
如果发现服务器OS是64位的,Register.cmd会注册amd64文件夹下的dll,否则注册x86下的dll
8.将Register.cmd的属性中的"Copy to Output Directory"设置成"Copy always"。
9.修改ServiceDefinition.csdef,在ServiceDefinition节点里添加Startup任务
其中,commandLine指向我们写好的cmd文件。需要注意的是,这个脚本必须是以ANSI格式编码的。
executionContext:脚本的执行上下文,也就是这个脚本的执行权限。可以选项包括:
- limited:默认值。表示使用和当前Role所在进程相同的权限来执行这个脚本。
- elevated:表示使用本机管理员权限来执行这个脚本。当脚本进行了系统级别的操作,比如对IIS进行配置,就必须指定为elevated。
TaskType的可选值有三种,含义如下:
- Simple:默认值,只有当Task执行完成之后系统才会执行下一个Task。当所有Task执行完成之后才会开始启动Role。
- Background: startup任务在后台运行,系统不会等待Task执行完成就开始启动Role
- Foreground: 和Background方式类似,系统不会等待Task执行完成就开始启动Role。不同之处在于,只有当所有Task都执行完成之后Role才可能被重启。
10.在Default.aspx添加TextBox,Button和Label,并且在Button_Click添加如下代码:
LegacyCOMLib.Helper helper = new LegacyCOMLib.Helper();
Message.Text = helper.Greeting(Username.Text);
11.按F5运行VS工程,在pre-build过程中,Azure Project会先侦察CSDEF是否有Startup节点,如果有的话则执行CommandLine指向的cmd文件。我们这里的cmd文件的功能是:根据操作系统的版本,自动注册所对应的dll。并且会弹出窗口,表明注册成功。我们按"OK",让项目继续执行。
12.在aspx页面里,用户在textbox输入name的值,然后按"Greet me!",dll会调用自动返回一串字符串并且显示在页面上。
通过Startup功能,用户还可以通过系统命令修改系统配置,或者通过PowerShell执行更加复杂的操作(比如使用InstallUtil注册Windows Service)。另外和通过远程桌面手动修改系统配置不同,Startup功能会在系统迁移、故障恢复的时候自动执行,因此可以作为持久化的操作。