0

COM オブジェクトをラップするジェネリック基本クラスがあり、それを COM オブジェクトに制限したいと考えています。私は試しwhere TComObject : IUnknownましたが、コンパイラはそれを好きではありません。これを行う方法はありますか?

私は以下のコードを使用しています。何かばかげたことを見つけたら、フィードバックをお寄せください。

public abstract class ComWrapper<TComObject> : IDisposable, IComWrapper<TComObject> where TComObject : class 
{
    protected ComWrapper(TComObject comObject)
    {
        ComObject = comObject;
    }

    protected TComObject ComObject { get; set; }

    /// <summary>
    /// Use with caution, this accesses the COM object, cleanup might be needed
    /// </summary>
    /// <returns></returns>
    public TComObject GetComObject()
    {
        return ComObject;
    }

    public void SetComObject(TComObject comObject)
    {
        CheckAndReleaseComObject();
        ComObject=comObject;
    }

    public void Dispose()
    {
        Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // free managed resources
        }
        // free native resources if there are any.
        CheckAndReleaseComObject();
    }

    private void CheckAndReleaseComObject()
    {
        if (ComObject != null)
        {
            if (ComObject.GetType().IsCOMObject)
                Marshal.ReleaseComObject(ComObject);
            ComObject = null;
        }
    }
}
4

1 に答える 1

1

このような一般的な制約を設定することはできませんがMarshal.IsComObject、オブジェクトが COM オブジェクトであることを確認するようなものを使用することを検討できます。特にコンパイル時エラーが必要な場合は、運が悪いと思います。

また、SetComObject は複数回呼び出すことができることに注意してください。その場合、既に設定されている可能性のある com オブジェクトを "クリーンアップ" しないでください。また、ファイナライザー/デストラクタを削除したため、GC.SuppressFinalize を削除できるようになりました。これは、フレームワークがガベージ コレクションに到達した場合に com オブジェクトを解放するため、実際には必要ありません。

于 2012-11-01T09:36:40.177 に答える