我使用CC.net和NANT构建脚本自动化我们的deploymnet。我必须在部署期间停止并启动我们的COM +组件。
是否有NANT任务执行此操作?
答案 0 :(得分:1)
假设COM +组件是您的组件(ServicedComponent
个实例),那么您可以使用<regsvcs>
task来实现此目的。
您必须指明您的COM +组件所在的程序集,删除该应用程序(使用action
uninstall
{{1}}),然后重新安装(您可能需要两个任务实例)。
如果您的程序集不是COM +组件/应用程序的源,那么您将需要编写自己的自定义任务,通过COM互操作访问ActionType
。
答案 1 :(得分:1)
我一直在努力解决同样的问题。找不到比vbs脚本更详细的方法。我想出的解决方案如下:
我创建了一个引用NAnt.Core的C#.Net解决方案。我创建了两个继承自Nant Task类的类(任务)。你需要三件事: 1)在类
上放置TaskName属性 [TaskName("startupComApplicationTask")]
2)在要从Nant
传递的任何属性上放置Task属性 [TaskAttribute("machineName", Required = true)]
3)实现ExecuteTask()方法
最终结果是这样的:
[TaskName("startupComApplicationTask")]
public class StartupComApplicationTask: Task
{
private string _applicationName;
private string _machineName;
[TaskAttribute("applicationName", Required = true)]
public string ApplicationName
{
get
{
return _applicationName;
}
set
{
_applicationName = value;
}
}
[TaskAttribute("machineName", Required = true)]
public string MachineName
{
get
{
return _machineName;
}
set
{
_machineName = value;
}
}
protected override void ExecuteTask()
{
COMAdminCatalog objAdmin = new COMAdminCatalog();
objAdmin.Connect(MachineName);
var objCollection = (COMAdminCatalogCollection)objAdmin.GetCollection("Applications");
objCollection.Populate();
foreach (COMAdminCatalogObject objAppNames in objCollection)
{
if (objAppNames.Name.Equals(ApplicationName))
{
ICatalogCollection objComponents = (ICatalogCollection)objCollection.GetCollection("Components", objAppNames.Key);
objComponents.Populate();
}
}
objAdmin.StartApplication(ApplicationName);
}
}
显然,为了实现这一目标,您需要包含对ComAdmin互操作程序集的引用。您可以在Com引用中的“COM + 1.0类型库”下找到它。
构建项目,为您创建两个dll。互操作一个和你的。将它们放入你的nant文件夹(在bin目录中)。
您可以通过以下方式从Nant中调用这些:
<startupComApplicationTask machineName="193.132.119.249" applicationName="NantTest" />
重复shuting,只需调用ShutdownApplication而不是StartApplication。
希望这有帮助