Visual studio 在VS.NET2008中,基于.NET3.5的项目是否可以引用Silverlight3类库?

Visual studio 在VS.NET2008中,基于.NET3.5的项目是否可以引用Silverlight3类库?,visual-studio,.net-3.5,silverlight-3.0,Visual Studio,.net 3.5,Silverlight 3.0,首先,我知道Silverlight项目不能引用非基于Silverlight的项目,如Windows类库或Asp.net MVC项目。但我需要创建既支持基于Silverlight的项目又支持Asp.net MVC项目的项目 所以,我为我的共享源代码创建了基于Silverlight的项目。它在VS.NET2008和.NET3.5SP1上运行良好。然而,当我尝试使用基于.Net的项目中基于Silverlight的项目的某些方法时,我发现了一些错误,如下面的代码 基于Silverlight的方法 pub

首先,我知道Silverlight项目不能引用非基于Silverlight的项目,如Windows类库或Asp.net MVC项目。但我需要创建既支持基于Silverlight的项目又支持Asp.net MVC项目的项目

所以,我为我的共享源代码创建了基于Silverlight的项目。它在VS.NET2008和.NET3.5SP1上运行良好。然而,当我尝试使用基于.Net的项目中基于Silverlight的项目的某些方法时,我发现了一些错误,如下面的代码

基于Silverlight的方法

public static void InitializeInstance(object obj)
{
    // Initialize Field Value
    foreach (FieldInfo fi in obj.GetType().GetFields())
    {
        foreach (Attribute attr in fi.GetCustomAttributes(true))
        {
            if (attr is DefaultValueAttribute)
            {
                DefaultValueAttribute dv = (DefaultValueAttribute)attr;
                fi.SetValue(obj, dv.Value);
            }
        }
    }

    // Initialize Property Value
    foreach (PropertyInfo pi in obj.GetType().GetProperties())
    {
        foreach (Attribute attr in pi.GetCustomAttributes(true))
        {
            if (attr is DefaultValueAttribute)
            {
                DefaultValueAttribute dv = (DefaultValueAttribute)attr;

                if (pi.CanWrite)
                {
                    pi.SetValue(obj, dv.Value, null);
                }
            }
        }
    }
}
private void Form1_Load(object sender, EventArgs e)
{
    InitializeInstance(this);
}
基于.Net的方法

public static void InitializeInstance(object obj)
{
    // Initialize Field Value
    foreach (FieldInfo fi in obj.GetType().GetFields())
    {
        foreach (Attribute attr in fi.GetCustomAttributes(true))
        {
            if (attr is DefaultValueAttribute)
            {
                DefaultValueAttribute dv = (DefaultValueAttribute)attr;
                fi.SetValue(obj, dv.Value);
            }
        }
    }

    // Initialize Property Value
    foreach (PropertyInfo pi in obj.GetType().GetProperties())
    {
        foreach (Attribute attr in pi.GetCustomAttributes(true))
        {
            if (attr is DefaultValueAttribute)
            {
                DefaultValueAttribute dv = (DefaultValueAttribute)attr;

                if (pi.CanWrite)
                {
                    pi.SetValue(obj, dv.Value, null);
                }
            }
        }
    }
}
private void Form1_Load(object sender, EventArgs e)
{
    InitializeInstance(this);
}
错误详细信息

System.IO.FileNotFoundException: 无法加载文件或程序集 '系统,版本=2.0.5.0, 文化=中立, PublicKeyToken=7cec85d7bea7798e'或 它的一个依赖项。系统 找不到指定的文件。文件 名称:'系统,版本=2.0.5.0, 文化=中立, PublicKeyToken=7cec85d7bea7798e'at 初始化实例(对象对象对象)

最后,我尝试通过将Silverlight的system.dll复制到输出目录并引用它来解决这个问题。它仍然显示相同的错误。所以,我认为这个错误可能是.Net和Silverlight平台的局限性。你有没有办法避免这个问题

另外,我知道我可以使用一些共享代码。但我的项目不可能做到这一点。因为它非常复杂&比直接创建基于Silverlight或基于.Net的类库更复杂


谢谢,这里的问题是,这些类型使用不同的强名称共享程序集:Silverlight中的System.Windows、桌面CLR上的PresentationFramework或PresentationCore

因此,在运行时,无法加载预期的类型,并且Silverlight到桌面类型没有类型转发器

我推荐的解决方案 考虑使用文件链接,而不是试图引用同一个构建的二进制文件。

这样,您可以为项目创建一个如下所示的源结构:

MyApp\
   Silverlight\
     Page.xaml
     Page.xaml.cs
     (link) ..\AspMvc\MySharedDataFile.cs
   AspMvc\
     MySharedDataFile.cs
     MyApp.cs
这样,源代码将与这两个项目一起重新编译。我们在Silverlight工具包上使用它为WPF和Silverlight构建许多控件,包括图表和数据可视化控件。这是通过为每个平台重建,而不是从两个平台引用二进制文件

要在VisualStudio中插入链接,只需右键单击项目或其中一个文件夹,添加现有项,然后在“资源管理器打开文件”对话框中找到它。但是,不只是单击按钮,而是单击“添加文件”按钮上的小向下箭头下拉列表,然后选择“添加为链接”选项

然后,它只是从另一个位置构建该文件,但它不是副本,所以您可以在一个位置维护它,并在两个位置使用它

疯狂的解决方案 您可以从信任度更高的桌面应用程序中使用.NET反射来实际创建一个新的应用程序域,连接到程序集解析事件,并查看其功能。您可以从桌面CLR返回类型,或者只是不返回这些警告


不知道它是否有效。

我试图通过删除System.dll中包含的所有类来解决这个问题。它很好用。但我不明白。为什么某些类(包含在System.Core.dll中)不会像System.dll那样导致错误?我绝对建议使用文件链接,尽管您不希望这样。使用文件链接方法,您试图包含哪些不适合您的特定类型的代码或复杂对象?我知道。我可以为你链接文件来构建源代码。如何在不在Silverlight framework中的.Net framework的系统程序集中使用类型和方法?