COM+ 运行进程






4.79/5 (9投票s)
2005年7月28日
3分钟阅读

99772

1870
监控 COM+ 运行的应用程序。
引言
以下是一个应用程序,适用于那些想知道特定进程 ID(例如,dllhost.exe 进程)背后的 COM+ 应用程序名称,以及那些想监控这些 COM+ 组件所使用的内存的人。
背景
COM+ 可以通过两种方式托管 .NET 组件:库应用程序和服务器应用程序。 库应用程序在调用者进程中运行组件,而服务器应用程序在 COM+ 创建的专用进程中运行组件,称为 Dllhost.exe。 服务器应用程序在单独的进程中运行,这会影响应用程序的整体性能,因为需要跨越进程边界来调用组件服务。
许多组织和个人希望监控他们的 COM+ 应用程序,例如进程 ID 背后的 COM+ 应用程序名称以及 COM+ 组件正在使用的内存量。 这启发我制作了一个简单的应用程序,该应用程序具有上述功能。
使用代码
第一步是添加对以下命名空间的引用
using System;
using System.Drawing;
using System.Diagnostics;
using System.ComponentModel;
using System.Windows.Forms;
using COMSVCSLib; // Path = C:\Windows\System32\comsvcs.dll
using System.Runtime.InteropServices;
每当您按下“Get Application(s)”按钮时,在 btnGetApplications_Click(object sender, System.EventArgs e)
函数中,将调用 GetCOMPlusApplicationsList();
函数。 这是获取所有正在运行的 COM+ 应用程序列表并获取关联的进程 ID 的主要函数。
/// This function retrieves all the running COM+ commponent services
/// and also retrieves their application ID.
public GetCOMPlusApplicationsList()
{
// MtsGrp interface provides methods
// for enumeration through running packages.
COMSVCSLib.MtsGrp GrpObj = null;
Type dcomType = Type.GetTypeFromProgID("mts.MtsGrp");
// Creating new instance of MtsGrp component.
Object dcomObj = Activator.CreateInstance( dcomType );
GrpObj = (COMSVCSLib.MtsGrp) dcomObj;
object obj = null;
COMSVCSLib.COMEvents eventObj = null;
for (int i = 0 ;i < GrpObj.Count ; ++i)
{
GrpObj.Item (i, out obj);
eventObj = (COMSVCSLib.COMEvents) obj;
// Add information to list view.
AddtoListView(eventObj.GetProcessID(),eventObj.PackageName);
// Release the resources held by object.
Marshal.ReleaseComObject(obj);
obj = null;
Marshal.ReleaseComObject(eventObj);
eventObj = null;
}
Marshal.ReleaseComObject( dcomObj );
dcomObj = null;
return;
}
在 GetCOMPlusApplicationsList()
函数中,首先,它创建接口 COMSVCSLib.MtsGrp
的引用对象,该对象用于枚举正在运行的包。 稍后,您需要获取与指定程序标识符 (progID) 关联的类型。 在这种情况下,指定“mts.MtsGrp
”progID 以获取与此组件关联的类型。 下一步是通过调用 .NET 类函数 Activator.CreateInstance( dcomType )
来创建此类型对象的实例。
现在您获得了 MtsGrp
对象。 您可以使用 GrpObj.Item (i, out obj)
函数获取每个实例,并将其类型转换为 COMEvents
对象,如下所示
eventObj = (COMSVCSLib.COMEvents) obj;
下一步是分别调用函数 eventObj.GetProcessID()
和 eventObj.PackageName
函数和属性,以获取正在运行的 COM+ 应用程序的进程 ID 和应用程序名称。 之后,调用 AddtoListView
函数,该函数将进程 ID 和应用程序名称添加到 ListView
。 之后,您需要调用在 System.Runtime.InteropServices.Marshal
中定义的 Marshal.ReleaseComObject(obj)
函数,以释放此对象持有的内存资源。 请参阅 AddtoListView
函数中发生的情况
private void AddtoListView(int pid, string appName)
{
listItem = this.comlistView.Items.Add(pid.ToString());
listItem.SubItems.Add(appName);
}
当您获得 COM+ 应用程序时,您可以获得这些 COM+ 应用程序使用的内存。 为此,您可以选择您想了解的 COM+ 应用程序,然后按下“Get Memory”按钮,该按钮会以字节为单位显示内存使用情况。 现在让我们看看“Get Memory”按钮的 Click
事件中发生了什么。
private void getMemoryButton_Click(object sender, System.EventArgs e)
{
// Getting process id from pid text box.
string pid = this.pidTextBox.Text ;
if(pid =="")
{
MessageBox.Show("Please enter a process Id!", "Process ID");
return;
}
// Get all the process of the system.
Process []getProcess = Process.GetProcesses();
// Iterate through these process to find the specific process.
foreach(Process pro in getProcess)
{
if(pro.Id.ToString() == pid)
{
// getting physical memory used by this process.
this.phyMemTextBox.Text = pro.WorkingSet.ToString() + " bytes";
// getting virtual memory used by this process.
this.virTextBox.Text = pro.VirtualMemorySize.ToString() + " bytes";
return;
}
}
MessageBox.Show("Invalid process Id","Invalid ID");
}
关注点
这是我在软件公司 Ultimus 给我的第一个任务。 首先我努力获取正在运行的 COM+ 包,但后来当我探索了很多之后,这个解决方案印在了我的脑海中,我最终提出了这个想法。 在此之前,我从未熟悉 COM+ 组件。 但是这个应用程序对于通常使用 COM+ 包的组织来说可能非常有用。
历史
- 2005 年 7 月 28 日: 首次发布。