是否可以在VS.net 2008中通过基于.Net 3.5的项目引用Silverlight 3类库?

时间:2009-07-29 07:40:25

标签: visual-studio .net-3.5 silverlight-3.0

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

因此,我为共享源代码创建了基于Silverlight的项目。它适用于VS.net 2008& .Net 3.5 SP1。但是,当我尝试使用基于.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);
                }
            }
        }
    }
}

.Net-based Method

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   InitializeInstance(Object obj)

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

PS。我知道我可以使用this technique来获得一些共享代码。但是我的项目不可能做到这一点。因为它非常复杂而且非常复杂,而不是直接创建基于Silverlight或.Net的类库。

谢谢,

1 个答案:

答案 0 :(得分:1)

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

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

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

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

MyApp\
   Silverlight\
     Page.xaml
     Page.xaml.cs
     (link) ..\AspMvc\MySharedDataFile.cs
   AspMvc\
     MySharedDataFile.cs
     MyApp.cs

这样,源代码将与两个项目一起重新编译。我们在Silverlight Toolkit上使用它来为WPF和Silverlight构建许多控件,包括图表和数据可视化控件。这是通过重建每个平台,而不是从两个平台引用二进制文件。

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

然后,它只是从另一个位置构建该文件,但它不是副本,因此您可以将其保存在一个位置并在两者中使用。

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

不知道它是否有效。