为什么完全限定程序集名称有时需要空格
本文关键字:空格 程序集 为什么 | 更新日期: 2023-09-27 17:49:34
我今天偶然发现了这个,我找不到任何关于它的信息。这就是我在这里问的原因。也许有人知道为什么。
我添加了一个自定义的WCF行为扩展到我的web.config。它看起来像这样:
<behaviorExtensions>
<add name="errorBehavior" type="MyNs.TracingErrorBehaviorElement,MyNs,
Version=1.0.6.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
(没有空格:MyNs.TracingErrorBehaviorElement,MyNs
)
在我的开发机器上,在我们的临时服务器上,在我们的实时服务器上,等等。
今天我们在客户服务器上安装了产品,得到了以下异常:
System.Configuration。ConfigurationErrorsException:发生错误的配置节处理程序系统。serviceModel/behaviors:扩展元素errorBehavior不能添加到此元素。验证扩展是否为在扩展集合中注册system.serviceModel/扩展/behaviorExtensions…
花了半个小时在网上搜索可能的原因后,我在完全限定的程序集名称中添加了空格。所以我改成:
<behaviorExtensions>
<add name="errorBehavior" type="MyNs.TracingErrorBehaviorElement, MyNs,
Version=1.0.6.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
(参见空格:MyNs.TracingErrorBehaviorElement, MyNs
)
并且成功了
有人知道为什么在一些机器上没有空格而在其他机器上没有吗?我检查了.Net-versions
。他们匹配。这是由区域环境引起的吗?
编辑说:
我检查了所有机器上使用的。net版本,它们都是相同的:。net 4.0但我发现,在这台机器上,我得到了一个缺失空白的错误,而在其他机器上,它是有效的:所有没有空白的机器都安装了。net Framework 4.5。所以它可能是那些在4.0中修复并在4.5中部署的错误之一,对吗?
这是一个已知的错误,由Shawn Cicoria在这篇博文中记录。
它没有说任何关于这个bug是什么时候修复的,WCF配置类完全太复杂了,无法缩小范围。我猜测,考虑到这篇文章的年龄,这是一个。net 4.5修复。由于安装了4.0,在客户端站点上出现了故障。从你为你的项目选择的目标中你会知道得更好。
这是一个很好的例子,说明微软修复bug是多么困难。
MSDN说:
空格在除程序集名称外的所有类型名称组件中都是相关的。在程序集名称中,','分隔符之前的空格是相关的,但','分隔符之后的空格将被忽略。
实际上,测试表明情况确实如此—GetType
和其他类型解析方法确实忽略了,
分隔符之后的空格。
Type.AssemblyQualifiedName
获得的值。也许它在某个地方保存了一个类型缓存,我不知道。
至于为什么这只发生在某些机器上,我打赌是GAC或其他稍微修改汇编/类型分辨率的系统。由于您没有使用snk,所以GAC是不可能的,但是也许有一些配置可以为您改变这一点,也许在机器中。如果是在IIS配置的web应用程序中,
这似乎是。net 3.5中的一个配置错误,. net 4.0+没有同样的问题。您确定应用程序正在运行相同版本的。net吗?如果你正在处理一个web应用程序(客户的服务器很可能被配置为使用。net 3.5,事实上,你应该指定system.web.compilation[targetFramework]
和httpRuntime
以正确的框架版本为目标),这很可能是不同的。我想添加一个链接到错误,但虽然它在很多地方被引用,文章似乎已经从MS连接中删除了:)