在.xaml活动中,对同一程序集中的类型的引用使用名称空间'xmlns:local',而不使用这样的程序集引用:
xmlns:local="clr-namespace:Foo.Bar"
由于没有程序集我的单元测试哪个加载xaml失败,我的代码在第三个程序集(Azure辅助工作者角色)中无法加载它,因为它不知道名称空间属于哪个程序集。
无论如何,我可以强制xmlns像这样引用程序集(以及xaml文件中的所有其他xmlns):
xmlns:local="clr-namespace:Foo.Bar;assembly=Foo"
如果我手动添加;assembly=Foo
它可以正常工作,但Visual Studio会在我更改内容时继续删除程序集字符串。
答案 0 :(得分:0)
不,你不能强制LocalAssembly。
您可以引用程序集并以这种方式使用活动。或者,如果要加载.xaml文件,可以使用XamlXmlReader指定LocalAssembly。
我在最新版本的Microsoft.Activities.Extensions中添加了一个名为XamlHelper的类,它可以为您完成此操作,但这是它的工作原理
/// <summary>
/// Loads a XAML or XAMLX file
/// </summary>
/// <param name="xamlFile">
/// The xaml file.
/// </param>
/// <param name="localAssembly">
/// The local assembly.
/// </param>
/// <returns>
/// The activity or root activity of a WorkflowService
/// </returns>
public static Activity Load(string xamlFile, Assembly localAssembly)
{
Contract.Requires(localAssembly != null);
if (localAssembly == null)
{
throw new ArgumentNullException("localAssembly");
}
var readerSettings = new XamlXmlReaderSettings
{
LocalAssembly = localAssembly,
AllowProtectedMembersOnRoot = true
};
var xamlType = GetXamlType(xamlFile);
switch (xamlType)
{
case WorkflowXamlFileType.Activity:
using (var reader = new XamlXmlReader(xamlFile, readerSettings))
{
return ActivityXamlServices.Load(reader);
}
case WorkflowXamlFileType.WorkflowService:
using (var reader = new XamlXmlReader(xamlFile, readerSettings))
{
return ((WorkflowService)XamlServices.Load(reader)).GetWorkflowRoot();
}
default:
throw new ArgumentException("Invalid file extension on xamlFile");
}
}