4

他の .NET アプリケーションを介して COM 可視 .NET クラスを使用しようとすると、例外が発生します:

メッセージ: オブジェクトの型は __ComObject であるか、__ComObject から派生している必要があります。

パラメータ名: o

スタック トレース: System.Runtime.InteropServices.Marshal.ReleaseComObject (オブジェクト 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 オブジェクトをインスタンス化していることはわかっています。

4

4 に答える 4

0

しかし、どのようにクラスインスタンスを作成していますか?式を使用するだけでnew MyViewer()は、COMオブジェクトは作成されません。代わりに、ReleaseComObjectメソッドでは使用できない単純な古い.Netオブジェクトを作成します。

サンプルコード、特にMyViewer実装に関する行に基づくと、COMオブジェクトを扱っているようには聞こえません。代わりに、COMインターフェイスを実装する管理対象オブジェクトがあるように見えます。

ReleaseComObjectを使用するには、実際にCOM/RCWオブジェクトが必要です。

于 2010-08-24T08:28:54.930 に答える
0

私の推測では、実際にはCOMを使用しておらず、参照されている.NETクラスを使用しているだけだと思います。プロジェクトに次のようなコードが含まれている場合

MyViewer viewer = new MyViewer();

MyViewerまた、COM参照としてnotを含むライブラリを追加した場合、実際にはCOMを使用していません。

于 2010-08-24T08:31:11.817 に答える