2009年的错误如何导致Docker for Windows和Razer Synapse之间发生冲突

今天,我遇到了一个非常有趣的错误:如果运行Razer Synapse驱动程序控制面板,则Windows的Docker将无法启动。

但是最有趣的是它为什么发生...



编写了两个应用程序,因此您一次只能运行一个实例。为此,他们使用.NET程序集作为GUID密钥来创建全局互斥锁,对吗?

但是,a,他们做错了,而且,他们同样是错的。错误代码如下所示:

string.Format("Global\{0}", (object) Assembly.GetExecutingAssembly().GetType().GUID);

这个想法是获得可执行程序集的GUID并基于该程序集创建一个互斥体,这将阻止启动多个实例。

但这一定是错误的。不应该打个电话GetType()

此选项不返回特定程序集的GUID,而是返回.NET中内置的类型的GUID,该类型将程序集描述为- System.Reflection.RuntimeAssembly

因此,当他们创建互斥锁时,他们不会使用自己代码中的GUID,而是使用.NET内部的GUID。对于这两个应用程序,此GUID将相同。

这怎么发生的?有趣,但我们确切地知道怎么做。应该指责Stackoverflow!

早在2009年,一个昵称为Nathan的用户问了一个问题-“ 如何获取正在执行的程序集的GUID?“。12分钟后,Cerebrus用户回答了他,但答案中有错误。

一年零一个月后,用户Yoopergeek指出了一个错误。Cerebrus又过了三年,并改正了他的答案-但您不能删除它,因为答案已被标记作为“接受”

因此,在回答2009年问题的错误造成的,至少存在到2018年三月的错误

作业的所有程序员阅读这篇文章:想想你将如何找到你的应用程序这样的错误?该代码似乎有效,但是您甚至没有意识到它实际上已损坏:您不会同时运行两个程序并出现相同的错误,只有当用户开始抱怨时您才知道问题所在。

在发布之前,如何更改开发过程以检测此类错误?

All Articles