【问题标题】:could not load system.xml with silverlight class library无法使用 silverlight 类库加载 system.xml
【发布时间】:2012-04-15 07:29:00
【问题描述】:

我有 3 个项目 - silverlight 应用程序 A 和 2 个 silverlight 类库 B、C。我的序列化逻辑在项目 C,方法 CallSer() 中。如果 B 的例程调用 CallSer(),则一切正常。但是,如果 C 中的例程调用 CallSer(),则会出现以下错误。我尝试设置 Copy Local 属性,但没有帮助(当 Copy Local = True 时,我看到程序集被复制到调试文件夹中)。这似乎令人惊讶,有人对如何解决这个问题有想法吗?谢谢。

{System.IO.FileNotFoundException: 无法加载文件或程序集 'System.Xml,版本=5.0.5.0,文化=中性, PublicKeyToken=7cec85d7bea7798e' 或其依赖项之一。这 系统找不到指定的文件。文件名:'System.Xml, 版本=5.0.5.0,文化=中性,PublicKeyToken=7cec85d7bea7798e'}

更新:我做了更多分析,发现对 CallSer() 的调用实际上来自另一个 .NET 类库 D。所以调用堆栈显示为 D -> C -> CallSer()。只要我有System.Xml.Serialization 对C 的引用,我不确定这会有什么不同。另外,我没有看到System.Xml.Serialization 在D 的添加引用选项中列出?为什么会这样?

更新:看起来 XmlSerializer 对加载哪个引用感到困惑。这是因为 Silverlight 在 System.Xml.Serialization.dll 程序集中定义了 XmlSerializer,而 .NET 框架在 System.Xml.dll 中有它。我的项目 D 引用了 System.Xml,C 有 System.Xml 和 System.Xml.Serialization。如何确保 C 始终引用 Silverlight 版本的 dll?

【问题讨论】:

  • 检查您的所有项目是否正确定位 Silverlight 5。其中一个引用必须是错误的。最可靠的检查方法是以文本形式打开三个项目文件并比较其中的引用,但您应该可以直接从 Visual 进行。
  • 我检查了文件,它们指向 5.0。 v5.0
  • 那么对 System.Xml 的引用之一肯定是错误的......
  • 没人有什么想法吗?我相信有人会陷入这种情况!
  • 也许检查 GAC(全局程序集缓存),看看哪个版本存在

标签: c# silverlight visual-studio-2010 xml-serialization silverlight-5.0


【解决方案1】:

我在尝试运行单元测试时遇到了同样的问题,问题是如果调用 Silverlight 类库的代码是针对“桌面”.Net 框架构建的,您将遇到冲突,因为它将无法要加载 Silverlight 版本的 dll,只有 Silverlight 运行时可以加载针对 Silverlight CLR/BCL 构建的 dll。

看看创建Portable Class LibraryPortable Library Tool

【讨论】:

    【解决方案2】:

    Xml.Writer 也有同样的问题。

    我通过在我的 silverlight 项目和我的非silverlight 项目之间共享我的源代码文件来解决这个问题,使用 Visual Studio 中的“添加为链接”。 我还必须使用#ifdef SILVERLIGHT 来拥有一个单独的命名空间。

    Lloyd 的便携式类库方法看起来更简洁,但我没有时间尝试。

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多