Marshal.ReleaseComObject抛出异常

时间:2010-08-24 08:22:09

标签: c# interop com-interop comvisible

尝试通过其他.NET应用程序使用COM可见.NET类并获得异常:

  

消息:对象的类型必须是   __ComObject或派生自__ComObject。

     

参数名称:o

     

Stack Trace:at   System.Runtime.InteropServices.Marshal.ReleaseComObject(对象   ○)

该课程如下:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IViewer : IComInteropDefinedInterface
{
}

[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
[Guid("[some guid]")]
public class MyViewer : UserControl, IViewer    
{
    //IViewer implementation
}

我用以下内容注册该组件:

regasm [Assembly Path] /tlb /codebase

客户端应用程序也在.NET中成功实例化给定的类,但当他调用Marshal.ReleaseComObject()时,它会得到上述异常。

解决这个问题的任何想法?

修改 不幸的是,我无法提供客户端应用程序代码来实例化我的对象。但是我知道客户端使用相同的方法来实例化真正的COM对象。

4 个答案:

答案 0 :(得分:3)

最近,当重新实现托管代码的本机COM时,我遇到了这个问题。 解决方案是询问对象是否是Marshal.IsComObject的本机COM,只有本机COM必须与Marshal.ReleaseComObject一起发布。

这是代码:

if (Marshal.IsComObject(comObject))
{
     Marshal.ReleaseComObject(comObject);
}
comObject = null;

重要:您必须确定,在发布后不再使用该对象。

有关更详细的说明,请阅读以下文章:http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx

答案 1 :(得分:0)

但是你是如何创建类实例的呢?简单地使用表达式new MyViewer()不会创建COM对象。相反,它会创建一个普通的旧.Net对象,该对象不能与ReleaseComObject方法一起使用。

根据您的示例代码,特别是关于具有实现的MyViewer行,它听起来并不像您正在处理COM对象。相反,它看起来像你有一个实现COM接口的托管对象。

为了使用ReleaseComObject,你需要实际拥有一个COM / RCW对象。

答案 2 :(得分:0)

我的猜测是你实际上并没有使用COM而只是使用引用的.NET类。如果您的项目包含

之类的代码
MyViewer viewer = new MyViewer();

并且您已添加包含MyViewer的库而不是COM引用,您实际上并未使用COM。

答案 3 :(得分:-1)

我宁愿尝试:

# IF cycle 
if (df$phd == "no") {

      df$phd.status = ifelse(df$gre <151, "No PhD low score", ifelse(df$gre >151, "No PhD high score")

} else (df$phd == "yes") {

  df$phd.status = ifelse(df$age <30, ifelse(df$gre <151, "PhD 30yr low score"))

}