[英]Marshal.ReleaseComObject throws exception
嘗試通過其他.NET應用程序使用COM可見.NET類並獲取異常:
消息:對象的類型必須是__ComObject或從__ComObject派生。
參數名稱:o
堆棧跟蹤:位於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
但是如何創建類實例? 簡單地使用表達式new MyViewer()
不會創建COM對象。 而是創建一個普通的舊.Net對象,該對象無法與ReleaseComObject方法一起使用。
根據示例代碼,特別是有關MyViewer
具有實現的代碼行,聽起來好像您在處理COM對象。 而是看起來您有一個實現COM接口的托管對象。
為了使用ReleaseComObject,您實際上需要有一個COM / RCW對象。
我的猜測是您實際上不是在使用COM,而是僅使用了引用的.NET類。 如果您的項目包含類似
MyViewer viewer = new MyViewer();
並且您已添加了包含MyViewer
的庫, MyViewer
不是將其作為COM引用,實際上您並未在使用COM。
我寧願嘗試:
if (comObject != null)
{
if (System.Runtime.InteropServices.Marshal.IsComObject(comObject))
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(comObject);
}
comObject= null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.