gpt4 book ai didi

c# - Marshal.ReleaseComObject 抛出异常

转载 作者:行者123 更新时间:2023-11-30 12:36:21 27 4
gpt4 key购买 nike

尝试通过其他 .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 对象。

最佳答案

我最近在为托管代码重新实现 native COM 时遇到了这个问题。解决方案是询问对象是否是带有 Marshal.IsComObject 的 native COM,只有 native 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

关于c# - Marshal.ReleaseComObject 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3554652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com