【发布时间】:2011-12-19 19:11:09
【问题描述】:
我有 3 个程序集、一个 WP7 应用程序(针对 7.0)、一个 Web 服务项目(运行 4.0)和一个包含通用类型的可移植类库(从模板构建并针对 WP7、SL4 和 .NET 4.0)在前两者之间使用。
当在本地(在 IIS Express 中)运行时,一切正常,但是当针对已部署的 Web 服务程序集实例(在我几乎无法控制的远程 IIS 服务器上)运行时,会出现以下异常:
System.IO.FileNotFoundException:无法加载文件或程序集 'System.Xml.Serialization,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089' 或其依赖项之一。这 系统找不到指定的文件。文件名: 'System.Xml.Serialization,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089' ---> System.IO.FileNotFoundException: 无法加载文件或程序集“System.Xml.Serialization, 版本=2.0.5.0,文化=中性,PublicKeyToken=31bf3856ad364e35, Retargetable=Yes' 或其依赖项之一。系统找不到 指定的文件。文件名:'System.Xml.Serialization, 版本=2.0.5.0,文化=中性,PublicKeyToken=31bf3856ad364e35, Retargetable=Yes'
堆栈跟踪表明它是在第一次调用 PCL 时,如果它是像上面这样的类型加载失败,这将是有意义的。
如果我删除对 PCL 程序集的引用,然后将密钥类文件添加到两个程序集,一切正常,但是我想避免这种代码重复......所以问题是:为什么这发生了?如何配置 PCL 以使其按书面方式运行?
编辑:更多信息...我的 PCL 使用XmlSerializer,它位于桌面上的 System.Xml.dll 和 Silverlight 中的 System.Xml.Serialization.xml 中...一个不存在的程序集'不存在于完整的桌面框架下......所以这个失败是有道理的,只有在 PCL 世界中,这些程序集/类中的一些是自己分解出来的
在这种情况下,XmlSerializer 实际上存在于 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETPortable\v4.0\Profile\Profile2\System.Xml.Serialization.dll 中(由 PCL 引用)...作为测试,我向 Web 项目添加了相同的引用...但是在 Web 项目的运行时,它失败并出现黄屏死机,说明:
无法加载文件或程序集“System.Xml.Serialization”或其中之一 它的依赖关系。定位程序集的清单定义不 匹配程序集引用。 (HRESULT 异常:0x80131040)
【问题讨论】:
-
您是否已确认您的 Web 服务在远程服务器上运行的应用程序池设置为使用与本地环境中相同的 .NET 版本?
-
您需要使用Fusion log viewer. 进行调试,只需确保以管理员身份运行它,打开日志,然后在尝试调试之前重新启动。您将看到 CLR 在哪里寻找程序集,以及什么版本,并从那里确定为什么找不到它(如果您甚至安装了它)。
-
@M.Babcock。远程服务器和本地 IIS Express 实例都在 4.0.30319.239 下运行。
-
@Will。因为远程服务器是一个共享的 Web 主机,所以我无法访问这些类型的日志,也无法访问注册表来调整密钥以启用它。
-
@BrendanGrant:嗯,好像服务器没有安装正确的程序集。