与它的基础RCW分开的COM对象不能使用 [英] COM object that has been separated from its underlying RCW can not be used

查看:90
本文介绍了与它的基础RCW分开的COM对象不能使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



当我从" http://msdn.microsoft.com/zh-cn/library/cc723870(VS.85).aspx ";我得到无法使用与其基础RCW分离的COM对象".例外.

我应该设置任何项目设置来解决此异常吗?我在做什么错?


使用System;
使用System.IO;
使用System.Xml.XPath;
使用System.Management;


//exchangeDataItem xml文档示例实例PROPAGATED =真" TYPE =字符串"</PROPERTY>
//< PROPERTY NAME =数据" TYPE =字符串">
//< VALUE> AUTOBVT-4OVYXAB</VALUE>
//</PROPERTY>
//< PROPERTY NAME =描述" PROPAGATED =真" TYPE =字符串"</PROPERTY>
//< PROPERTY NAME ="ElementName" PROPAGATED =真" TYPE =字符串"</PROPERTY>
//< PROPERTY NAME =名称" TYPE =``字符串''>
//< VALUE> FullyQualifiedDomainName</VALUE>
//</PROPERTY>
//TYPE ="uint16">
//< VALUE> 2</VALUE>
//</PROPERTY>
//</INSTANCE>



命名空间HyperVSamples
{
类GetVirtualMachineDNSName
{{br>

bool running = false;

的foreach(UINT16 operationStatus在(UINT16 [])VM [" OperationalStatus的"])结果,{结果,如果(operationStatus ==启用),点击{结果,运行= TRUE;结果,破;
}}

}

返回运行;
}

静态无效的GetVirtualSystemDNS(字符串vmName)
{{
)ManagementScope scope = new ManagementScope(@``root \ virtualization'',null);

字符串查询= String.Format(``从Msvm_ComputerSystem中选择*其中ElementName ='{0}''',vmName);

ManagementObjectSearcher searcher =新的ManagementObjectSearcher(作用域,新的ObjectQuery(查询));

ManagementObjectCollection vms = searcher.Get();

的foreach(VM的ManagementObject在VMS),点击{结果,如果(VMRunning(VM))结果,{结果ManagementObjectCollection kvpExchangeComponents = vm.GetRelated(QUOT; Msvm_KvpExchangeComponent");结果,如果(kvpExchangeComponents .Count!= 1)
{{

的foreach(的ManagementObject kvpExchangeComponent在kvpExchangeComponents)结果,{结果的foreach(字符串exchangeDataItem在(串[])kvpExchangeComponent [" GuestIntrinsicExchangeItems"])结果,{结果的XPathDocument xpathDoc =新的XPathDocument(新StringReader (exchangeDataItem));

XPathNavigator navigator = xpathDoc.CreateNavigator(); '完全限定的域名']");结果,如果(导航= NULL){搜索结果导航= navigator.SelectSingleNode(QUOT;/INSTANCE/PROPERTY [@ NAME = '数据']/VALUE/子!: :text());

Console.WriteLine(虚拟机{0} DNS名称为:{1}",vmName,navigator.V ALUE);结果,断裂;结果,},点击}结果,},点击}结果,其他结果,{结果Console.WriteLine(QUOT;无法检索到虚拟机的DNS名称. VM {0}未处于运行状态'',vmName);
}
}
}

static void Main(string [] args)
如果if(args!= null&& args.Length!= 1)( :GetVirtualMachineDNSName vmName'');
返回;
}
的GetVirtualSystemDNS(args [0]);
此致,
Prasad

解决方案

感谢您的帖子!不幸的是,当前没有论坛发布您要提问的问题,因此我建议您将问题发布到以下Microsoft.public.platformsdk.complus_mts之一: 希望有帮助!


Hi,
 
When i am executing below example code from "
http://msdn.microsoft.com/en-us/library/cc723870(VS.85).aspx" i get "COM object that has been separated from its underlying RCW can not be used" exception.

Should i set any project settings to solve this exception? What is that i am doing wrong?


using System;
using System.IO;
using System.Xml.XPath;
using System.Management;


// exchangeDataItem xml document sample instance
//
//<INSTANCE CLASSNAME="Msvm_KvpExchangeDataItem">
//      <PROPERTY NAME="Caption" PROPAGATED="true" TYPE="string"></PROPERTY>
//      <PROPERTY NAME="Data" TYPE="string">
//         <VALUE>AUTOBVT-4OVYXAB</VALUE>
//      </PROPERTY>
//      <PROPERTY NAME="Description" PROPAGATED="true" TYPE="string"></PROPERTY>
//      <PROPERTY NAME="ElementName" PROPAGATED="true" TYPE="string"></PROPERTY>
//      <PROPERTY NAME="Name" TYPE="string">
//         <VALUE>FullyQualifiedDomainName</VALUE>
//      </PROPERTY>
//      <PROPERTY NAME="Source" TYPE="uint16">
//          <VALUE>2</VALUE>
//      </PROPERTY>
//</INSTANCE>       



namespace HyperVSamples
{
    class GetVirtualMachineDNSName
    {
        static bool VMRunning(ManagementObject vm)
        {
            const int Enabled = 2;

            bool running = false;

            foreach (UInt16 operationStatus in (UInt16[])vm["OperationalStatus"])
            {
                if (operationStatus == Enabled)
                {
                    running = true;
                    break;
                }
            }

            return running;
        }

        static void GetVirtualSystemDNS(string vmName)
        {
            ManagementScope scope = new ManagementScope(@"root\virtualization", null);

            string query = String.Format("select * from Msvm_ComputerSystem where ElementName = '{0}'", vmName);

            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, new ObjectQuery(query));

            ManagementObjectCollection vms = searcher.Get();

            foreach (ManagementObject vm in vms)
            {
                if (VMRunning(vm))
                {
                    ManagementObjectCollection kvpExchangeComponents = vm.GetRelated("Msvm_KvpExchangeComponent");
                    if (kvpExchangeComponents.Count != 1)
                    {
                        throw new Exception(String.Format("{0} instance of Msvm_KvpExchangeComponent was found", kvpExchangeComponents.Count));
                    }

                    foreach (ManagementObject kvpExchangeComponent in kvpExchangeComponents)
                    {
                        foreach (string exchangeDataItem in (string[])kvpExchangeComponent["GuestIntrinsicExchangeItems"])
                        {
                            XPathDocument xpathDoc = new XPathDocument(new StringReader(exchangeDataItem));
                            XPathNavigator navigator = xpathDoc.CreateNavigator();
                            navigator = navigator.SelectSingleNode("/INSTANCE/PROPERTY[@NAME='Name']/VALUE[child::text() = 'FullyQualifiedDomainName']");
                            if (navigator != null)
                            {
                                navigator = navigator.SelectSingleNode("/INSTANCE/PROPERTY[@NAME='Data']/VALUE/child::text()");
                                Console.WriteLine("Virtual machine {0} DNS name is: {1}", vmName, navigator.Value);
                                break;
                            }
                        }
                    }
                }
                else
                {
                    Console.WriteLine("Unable to retrieve virtual machine DNS name. VM {0} is not in running state", vmName);
                }
            }
        }

        static void Main(string[] args)
        {
            if (args != null && args.Length != 1)
            {
                Console.WriteLine("Usage: GetVirtualMachineDNSName vmName");
                return;
            }
            GetVirtualSystemDNS(args[0]);
        }
    }
}

Thanks & Regards,
Prasad

解决方案

Hello Prasad,

Thank you for your post!  Unfortunately there is not a current forum to post the question you are asking so I would recommend that you post your question to one of the microsoft.public.platformsdk.complus_mts located here:  http://www.microsoft.com/communities/newsgroups/list/en-us/default.aspx?dg=microsoft.public.platformsdk.complus_mts&mid=c4ac4330-7753-45d9-9721-b4bdd786bd85

Hope that helps!


这篇关于与它的基础RCW分开的COM对象不能使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆