簡體   English   中英

Marshal.ReleaseComObject引發異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM