我有一个独特的发展情况,并希望得到其他人的一些意见。
我有一种情况需要在富客户端应用程序中加载松散的xaml文件。 给定的松散xaml文件可能引用当前未加载到内存中的程序集 所以在加载松散的xaml之前加载引用的程序集。松散的xaml和绑 程序集存储在下载到客户端的不同后端服务器上 动态加载。
松散的xaml和/或程序集是特定于版本的,不幸的是应用程序可以 不得在服务器A中使用程序集渲染xaml。 v1 之间关闭。 v1 和xaml。 v1 ,在服务器B上使用程序集。 v2 。 两个程序集都使用相同的名称空间声明,因此“旧”程序集仍可以 对于任何给定的松散xaml,使用“较新”的。
问题是,如果我加载包含的xaml.v2,我没有得到assembly.v2的引用 在assembly.v2中引用“较新”的功能。
我显然无法从app域卸载assembly.v1,我不确定是否可以 xaml中的引用项,通过编组在不同的应用程序域中加载。
除了使用不同的命名空间引用之外的任何想法?
答案 0 :(得分:1)
我猜你已经在进行动态装配解析和加载了吗?如果是这样,那么你可以尝试用假的汇编名称代替Xaml中的实际汇编名称 - 然后你可以在汇编解析代码中使用它来加载并返回正确的汇编。例如如果您的原始来源Xaml是:
xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly"
你知道Xaml想要MyAssembly的v2,在解析它之前替换Xaml字符串中的程序集ref:
xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly.v2"
..然后在你的程序集解析/加载代码中,当你在末尾看到“.v2”位时,你会查找并加载该程序集。
请告诉我,如果我误解了这个问题,或者你现在没有做任何自定义集会决议 - 这肯定是我认为这种情况的关键。
答案 1 :(得分:1)
另一个选项(假设您正在对程序集进行版本控制)是简单地在ns声明中包含程序集版本,如下所示:
xmlns:ns0="clr-namespace:MyCompany.MyProject.MyNameSpace; Assembly=MyCompany.MyProject, Version=1.0.0.0"
答案 2 :(得分:0)
我还没有确认这是否有效,但我相信它可能会有效。您可以使用XmlnsDefinitionAttribute(在程序集级别)。 E.g。
装配V1 - >的AssemblyInfo.cs
[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v1", "MyCompany.MyProject" )]
装配V2 - >的AssemblyInfo.cs
[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v2", "MyCompany.MyProject" )]
然后在xaml:
xmlns:myassembly="http://schema.mycompany.com/myproject/v2"