创建类实例时出现MSMQQueueManagement错误

时间:2014-11-03 15:19:49

标签: interop msmq

我有一个例程来获取MSMQ队列的计数。我在2003和2008服务器上使用这段代码多年没有任何问题。我现在正在更新代码以在2012R2服务器上运行并测试我在Windows 8.1上使用以下代码编译VS2013 premium:

        String              sPath;
        Int32               nCount = 0;
        Object              oPath, oNull, oServer;
        String         []   sParts;
        Char           []   sSeps = { ':', '\\' };
        MSMQ.MSMQQueueManagementClass mgmt; 
//
//      The configuration path is a standard .net path. For DCOM we need the 
//      DIRECT= prefixed
//      
        sPath = "DIRECT=OS:" + m_QueueConfig.QueuePath;     
//
//      Split the string looking for the sever name
//        
        sParts = sPath.Split( sSeps, StringSplitOptions.RemoveEmptyEntries );
//
//      Get the count from the server
//      
        mgmt  = new MSMQ.MSMQQueueManagementClass();
        try
        {
            oPath = sPath;
            oNull = Type.Missing;
            if( sParts.Length < 2 || sParts[1] == "." )
                oServer = Environment.MachineName;
            else
                oServer = sParts[1];

            mgmt.Init( ref oServer, ref oNull, ref oPath );
            nCount  = mgmt.MessageCount;
        }
        catch( Exception )
        {
            nCount = 0;
        }
        finally
        {
            Marshal.ReleaseComObject( mgmt );
        }
        return nCount;

这将在&#34; mgmt上出错。 =新的MSMQ.MSMQQueueManagementClass()&#34;语句出现以下错误:

检索具有CLSID {33B6D07E-F27D-42FA-B2D7-BF82E11E9374}的组件的COM类工厂由于以下错误而失败:80040154未注册类(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))。

查看HKEY_CLASSES_ROOT配置单元,我可以找到39CE96FE-F4C5-4484-A143-4C2D5D324229,它指向system32中的MQOA.DLL,但不是错误的CLSID,这就是80040154。

我尝试使用system32 / mqoa.dll创建一个新的typelib,但我仍然遇到同样的错误。那么我做错了什么?

根据注册表我安装了MSMQ版本6.2.9200并且它适用于我的应用程序我只是无法加载管理界面。

1 个答案:

答案 0 :(得分:1)

    mgmt.Init( ref oServer, ref oNull, ref oPath );

MSMQQueueManagement接口没有Init()方法。在我看来,你正在混合不同的coclasses。 39CE96FE指导用于MSMQManagement,33B6D07E指导用于MSMQQueueManagment。后者不应该出现在注册表中,因此完全可以预期运行时错误。修正:

    mgmt  = new MSMQ.MSMQManagement();
    // etc..