尝试通过其他.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对象。
答案 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"))
}