【发布时间】:2011-09-27 16:01:24
【问题描述】:
我正在使用 CC.net 和 NANT 构建脚本自动化我们的 deploymnet。我必须在部署期间停止和启动我们的 COM+ 组件。
是否有执行此操作的 NANT 任务?
【问题讨论】:
我正在使用 CC.net 和 NANT 构建脚本自动化我们的 deploymnet。我必须在部署期间停止和启动我们的 COM+ 组件。
是否有执行此操作的 NANT 任务?
【问题讨论】:
假设 COM+ 组件是您的组件(ServicedComponent 实例),那么您可以使用 <regsvcs> task 来实现这一点。
您必须指出您的 COM+ 组件所在的程序集,删除应用程序(使用 action 和 uninstall 的 ActionType)然后重新安装它(为此您可能需要两个任务实例)。
如果您的程序集不是 COM+ 组件/应用程序的来源,那么您将需要编写自己的自定义任务,通过 COM 互操作访问 COM+ Administration API。
【讨论】:
我一直在努力解决同样的问题。找不到比 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" />
重复关闭,只需调用 ShutdownApplication 而不是 StartApplication。
希望对你有帮助
【讨论】: