c# – Marshal.ReleaseComObject抛出异常

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

Message: The object’s type must be
__ComObject or derived from __ComObject.

Parameter name: o

Stack Trace: at
System.Runtime.InteropServices.Marshal.ReleaseComObject(Object
o)

该课程如下:

[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对象.

最佳答案 最近,当重新实现托管代码的本机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

点赞