1

在 .xaml 活动中,对同一程序集中的类型的引用使用命名空间“xmlns:local”,而没有像这样的程序集引用:

xmlns:local="clr-namespace:Foo.Bar"

由于没有程序集,我的单元测试加载 xaml 失败,我的代码在第三个程序集(Azure Worker Role)中也无法加载它,因为它不知道命名空间属于哪个程序集。

无论如何我可以强制 xmlns 像这样引用程序集(以及 xaml 文件中的所有其他 xmlns):

xmlns:local="clr-namespace:Foo.Bar;assembly=Foo"

如果我;assembly=Foo手动添加它可以工作,但是当我更改某些内容时,Visual Studio 会不断删除程序集字符串。

4

1 回答 1

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");
        }
    }
于 2012-06-29T23:10:55.937 回答