我可以强制在xmlns上使用程序集名称:xaml中的local吗?

时间:2012-06-29 15:35:11

标签: visual-studio-2010 xaml workflow-foundation-4

在.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会在我更改内容时继续删除程序集字符串。

1 个答案:

答案 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");
        }
    }