65.9K
CodeProject 正在变化。 阅读更多。
Home

COM+ 运行进程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (9投票s)

2005年7月28日

3分钟阅读

viewsIcon

99772

downloadIcon

1870

监控 COM+ 运行的应用程序。

Running COM+ Process (Application snapshot)

引言

以下是一个应用程序,适用于那些想知道特定进程 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 日: 首次发布。
© . All rights reserved.