从ASP.NET项目引用Silverlight项目时的FileNotFoundException

时间:2011-02-20 11:08:52

标签: .net xml silverlight asp.net-mvc-2

正如标题所示,我在运行引用Silverlight类库的网页(ASP.NET MVC 2项目)时收到FileNotFoundException。当调用Silverlight库中某个类的方法时,出现以下错误:

  

无法加载文件或程序集“System.Xml.Linq,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”或其中一个依赖项。系统找不到指定的文件。

好的,关于我的设置的一些解释。我有三个项目;一个是Silverlight类库(使用Silverlight 4),其他是ASP.NET MVC 2 Web项目,以及一个Silverlight项目,它具有Web项目中托管的Silverlight控件。我在Web项目和Silverlight项目(带控件的项目)中引用了Silverlight库。在SL控件中,我从SL库中实例化一个类,并调用该类的方法之一。该方法包含对System.Xml.Linq库类的调用。调用该方法时会发生FileNotFoundException,但在实例化类时则不会发生。

由于这个项目的性质,我无法附上我正在使用的任何代码,但这里有一些任意代码来帮助说明上述解释:

Silverlight库中的类

public class XmlClass
{
    public void Execute()
    {
        // Calls to System.Xml.Linq classes
    }
}

Silverlight控件

public class SLControl : UserControl
{
    // ...

    private void SomeObject_SomeEvent(object sender, EventArgs e)
    {
        // Instantiate class
        XmlClass xmlClass = new XmlClass();

        // Execute
        xmlClass.Execute();           // <-- Error occurs here.
    }
}

现在更奇怪的事情是;我在项目的另一个点上遇到了这个错误。在另一点上,我有一个标准的.NET类库引用SL库并使用与SL控件相同的调用。我在同一个地方遇到错误,并确定在运行代码时,它试图在GAC中查找相关的System.Xml.Linq程序集。因此,我将其安装到GAC中,这解决了我的问题。

所以,我现在有点迷失,因为程序集仍然在GAC中,并且最初有问题的项目仍然有效。

有关于此的任何想法吗?

2 个答案:

答案 0 :(得分:2)

.NET Framework和Silverlight的运行时是完整.NET框架的子集。这就是为什么有一个名为Silverlight类库的单独项目模板,它针对Silverlight的.NET Framework版本。诸如Silverlight类库之类的Silverlight程序集不能被其他.NET项目使用,例如用于完整.NET框架的ASP.NET MVC应用程序。 Silverlight程序集不可移植。这是您似乎遇到的问题。

努力增加Silverlight程序集的可移植性,以便可以与其他.NET应用程序共享它们。您可以在Sharing Silverlight Assemblies with .NET Apps中详细了解相关信息。如果将Silverlight类库中引用的程序集限制为在blogpost中列为可移植和二进制兼容的核心程序集,那么您应该能够在ASP.NET MVC应用程序中使用Silverlight类库项目。

答案 1 :(得分:0)

感谢Mehmet Aras的帖子,我已经设法解决了我的问题。

基本上,由于引用的System.Xml.Linq程序集对Silverlight控件和Silverlight类库都不同,因此问题似乎已经出现。创建Silverlight项目时,它们包含对“C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \”中找到的程序集的引用。但是,有些在更改引用时最初修复问题时,我最终引用了相同的程序集,但在“C:\ Program Files(x86)\ Microsoft SDKs \ Silverlight \ v4.0 \ Libraries \ Client \”中找到”。当我为错误的项目再次执行此操作时,它解决了问题。

因此,我假设我实际上刚刚引用了不同的程序集。这也让我相信在创建项目时引用的程序集不适合使用。