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”类型的引用。将其替换为针对具有强标识的对象的锁。

从这里的链接http://msdn.microsoft.com/en-us/library/ms182290.aspx它指出以下对象具有弱标识:

MarshalByRefObject、ExecutionEngineException、OutOfMemoryException、StackOverflowException、字符串、MemberInfo、ParameterInfo、线程。

但我的对象不属于这些类别中的任何一个。

我也尝试过将我的对象设为静态,如下所述:C# lock and code analysis warning 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 回答