正如标题所示,我在运行引用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中,并且最初有问题的项目仍然有效。
有关于此的任何想法吗?
答案 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 \”中找到”。当我为错误的项目再次执行此操作时,它解决了问题。
因此,我假设我实际上刚刚引用了不同的程序集。这也让我相信在创建项目时引用的程序集不适合使用。