首先,我知道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的类库。
谢谢,
答案 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返回类型,或者只是禁止这些警告。
不知道它是否有效。