Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 引用版本化程序集的松散xaml_Wpf_Vb.net_Xaml_Assemblies - Fatal编程技术网

Wpf 引用版本化程序集的松散xaml

Wpf 引用版本化程序集的松散xaml,wpf,vb.net,xaml,assemblies,Wpf,Vb.net,Xaml,Assemblies,我有一个独特的发展情况,并希望从别人的一些投入 在这种情况下,我需要在富客户机应用程序中加载松散的xaml文件。 给定的松散xaml文件可能包含对当前未加载到内存中的程序集的引用 因此,在加载松散的xaml之前加载引用的程序集。松开xaml并系紧 程序集存储在不同的后端服务器上,这些服务器下载到客户端和 动态加载 松散的xaml和/或程序集是特定于版本的,不幸的是,应用程序可以 在从服务器A渲染xaml。v1与程序集。v1之间不能关闭 和xaml。v1以及服务器B上的汇编。v2。 两个程序集使用

我有一个独特的发展情况,并希望从别人的一些投入

在这种情况下,我需要在富客户机应用程序中加载松散的xaml文件。 给定的松散xaml文件可能包含对当前未加载到内存中的程序集的引用 因此,在加载松散的xaml之前加载引用的程序集。松开xaml并系紧 程序集存储在不同的后端服务器上,这些服务器下载到客户端和 动态加载

松散的xaml和/或程序集是特定于版本的,不幸的是,应用程序可以 在从服务器A渲染xaml。v1与程序集。v1之间不能关闭 和xaml。v1以及服务器B上的汇编。v2。 两个程序集使用相同的命名空间声明,因此“较旧”的程序集仍然可以 为任何给定的松散xaml使用“较新”的xaml

问题是,如果加载包含 对assembly.v2中“较新”功能的引用

显然,我无法从应用程序域卸载assembly.v1,我不确定是否可以 通过编组在不同应用程序域中加载的xaml中的引用项


除了使用不同的名称空间引用之外,还有其他想法吗?

我猜您已经在进行动态程序集解析和加载了?如果是这样,那么您可以尝试在Xaml中用假程序集名称替换真实的程序集名称-然后您可以在程序集解析代码中使用该名称来加载并返回正确的程序集。e、 g.如果原始源Xaml是:

xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly"
如果您知道Xaml需要MyAssembly的v2,请在解析它之前替换Xaml字符串中的assembly ref:

xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly.v2"
。。然后在程序集解析/加载代码中,当您看到末尾的“.v2”位时,您将查找并加载该程序集


如果我误解了这个问题,或者您目前没有进行任何自定义汇编解析,请告诉我-我认为这肯定是这种情况下的关键。

我还没有确认这是否可行,但我相信它可能会起作用。您可以使用XmlnsDefinitionAttribute(在程序集级别)。例如

程序集V1->AssemblyInfo.cs

[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v1", "MyCompany.MyProject" )]
[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v2", "MyCompany.MyProject" )]
Assembly V2->AssemblyInfo.cs

[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v1", "MyCompany.MyProject" )]
[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v2", "MyCompany.MyProject" )]
然后在xaml中:

xmlns:myassembly="http://schema.mycompany.com/myproject/v2"
另一种选择(假设您正在正确地对程序集进行版本控制)是只在ns声明中包含程序集版本,如下所示:

xmlns:ns0="clr-namespace:MyCompany.MyProject.MyNameSpace; Assembly=MyCompany.MyProject, Version=1.0.0.0"

我不确定您是否可以在这里使用不同的名称空间。“两个程序集使用相同的命名空间声明,因此对于任何给定的松散xaml,“旧”程序集仍然可以与“新”程序集一起工作。”当我尝试此操作时,它会显示“未知构建错误”,clr命名空间:blah;assembly=assembly.blah,Version=1.3.0.0'映射URI无效。你能提供一个MSDN参考的链接吗?对不起,这是我在没有实际尝试的情况下传递的信息。我读到assembly=后面的部分是AssemblyName(带有以下链接)(下一条注释)这里是这样说的AssemblyName的显示名称格式是以名称开头的逗号分隔的Unicode字符串,如下所示:名称'\0',因此,我的坏消息。我应该先测试一下。我刚刚测试过,结果和你一样。我曾经遇到过这个问题,原因是。。命名空间前的空格。