3

ビデオの再生に使用される ActiveX COM オブジェクトがあり、C# アプリケーションで使用されています。次のように宣言されます。

private AxVIDEOPLAYERUILib.AxVideoPlayerUI axVideoPlayerUI;

私のコードでは、次のようにロックされています。

lock (axVideoPlayerUI)
{
     axVideoPlayerUI.EnableControls = 1;
     axVideoPlayerUI.Visible = true;
     axVideoPlayerUI.ShowOverlay = 1;
     axVideoPlayerUI.OverlayPosition = 3;
     axVideoPlayerUI.Play();         
 }

しかし、私は取り除きたいという警告を受け取ります:

警告 1 CA2002: Microsoft.Reliability: 'VideoPlayerControl.LoadRecording(RecordVideo, int)' は、タイプ 'AxVideoPlayerUI' の参照をロックします。これを、強力な ID を持つオブジェクトに対するロックに置き換えます。

このリンク( http://msdn.microsoft.com/en-us/library/ms182290.aspx ) から、次のオブジェクトの ID が弱いことが示されています。

MarshalByRefObject、ExecutionEngineException、OutOfMemoryException、StackOverflowException、文字列、MemberInfo、ParameterInfo、Thread。

しかし、私のオブジェクトはこれらのカテゴリのいずれにも該当しません。

また、ここで説明されているように、オブジェクトを静的にしようとしました: C# ロックとコード分析警告 CA2002 ですが、エラーが発生します:

エラー 1 インスタンス参照でメンバー 'MyNameSpace.VideoPlayerControl.axVideoPlayerUI' にアクセスできません。代わりに型名で修飾してください

元の警告を取り除く方法を知っている人はいますか??

4

1 に答える 1

6

ロックに使用する別のオブジェクトを宣言するだけです。

private AxVIDEOPLAYERUILib.AxVideoPlayerUI axVideoPlayerUI;
private object axVideoPlayerUILock = new object();

と:

lock (axVideoPlayerUILock)
{
   ...

COM プロキシは によって実装されSystem.__ComObject、これは から派生しMarshalByRefObjectます。おそらく、言及されたものから派生した型も使用できないというガイダンスがより明確になる可能性があります。

于 2013-06-07T10:30:12.107 に答える