C# 我想删除警告:“我想删除你的警告。”;将其替换为针对具有强标识的对象的锁;

C# 我想删除警告:“我想删除你的警告。”;将其替换为针对具有强标识的对象的锁;,c#,.net,com,C#,.net,Com,我有一个ActiveX COM对象,用于播放视频,并在C#应用程序中使用它。声明如下: private AxVIDEOPLAYERUILib.AxVideoPlayerUI axVideoPlayerUI; 在我的代码中,有这样的锁: lock (axVideoPlayerUI) { axVideoPlayerUI.EnableControls = 1; axVideoPlayerUI.Visible = true; axVideoPlayerUI.ShowOve

我有一个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。可靠性: “VideoPlayerControl.LoadRecording(RecordVideo,int)”锁定 “AxVideoPlayerUI”类型的引用。用一把锁把它锁上 具有强烈同一性的物体

从这里的链接可以看出,以下对象具有弱标识:

MarshalByRefObject、ExecutionEngineeException、OutOfMemoryException、StackOverflowException、String、MemberInfo、ParameterInfo、Thread

但我的对象不属于这些类别

我也尝试过将我的对象设置为静态,如下所述:但这会给我带来错误:

错误1成员“MyNameSpace.VideoPlayerControl.axVideoPlayerUI”无法 可通过实例引用访问;用类型名限定它 反而


有人知道我如何摆脱最初的警告吗???

您可以声明一个单独的对象用于锁定:

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



COM代理由
系统实现。uu ComObject
,它又从
MarshallByRefObject
派生而来。也许指南可以更清楚地指出,从上述类型派生的类型也不可用。

的文档似乎只是展示了如何从另一个应用程序域创建该类型的新对象。因此,这里的私有字段仍然无法从外部访问,因此警告是不正确的-它应该只在锁定其中一种类型时触发,而不是锁定该类型的私有变量。@TamaMcGlinn-编译方法时,编译器不倾向于对其使用的类的所有字段执行完全转义分析。无法在本地确定该变量引用的对象的生存期。但这是一个警告,而不是一个错误,因为它不能证明它的使用也不正确。
lock (axVideoPlayerUILock)
{
   ...