繁体   English   中英

此类型分配错误是WCF或Windows Workflow Foundation 4.5中的错误吗?

[英]Is this type assignment error a bug in WCF or Windows Workflow Foundation 4.5?

我有一个Windows Workflow Foundation 4.5 WCF工作流服务应用程序。 我试图从我的CodeActivity<Dictionary<IEdmEntityType, DataTable>>返回Dictionary<IEdmEntityType, DataTable> 代码不会遇到编译时错误,但XAML无法编译。

我的XAML的相关部分是这样的:

我们有序列的变量声明,我试图转储我的返回值。 我们尝试分配的变量称为EntityTableRelationships

<p1:Sequence.Variables>
  <p1:Variable x:TypeArguments="x:String" Name="MetadataContent" />
  <p1:Variable x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)" Name="EntityTableRelationships" />
</p1:Sequence.Variables>

还有OutArgument ,来自Execute的返回值,来自我们的CodeActivity<..>被分配给EntityTableRelationships

<o:TransformMetadataToTables.Result>
  <p1:OutArgument x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)">
    <mca:CSharpReference x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)">EntityTableRelationships</mca:CSharpReference>
  </p1:OutArgument>
</o:TransformMetadataToTables.Result>

产生的XAML验证错误是:

Type 'http://schemas.microsoft.com/netfx/2009/xaml/activities:OutArgument(Dictionary)' is not assignable to type 'http://schemas.microsoft.com/netfx/2009/xaml/activities:OutArgument(Dictionary)' of member 'EntityTableRelationships'.

这就是我在设计师中看到的

最初我以为我错误地键入了我的返回值,或者我可能引用了一个名称相同但位于不同名称空间的接口。 不是这种情况。

我的另一个想法是,可能工作流程不能很好地与任何Dictionary<TKey, TValue>声明TKey作为任何接口。 我做了一个测试案例,它做到了这一点并且运行良好。 我还将这一步添加到设计器中并按顺序添加,就像在此处所做的那样。 我没有尝试使用IEdmEntityType作为TKey ,但没有理由,我可以看到,为什么它应该是任何不同的。

可能是什么原因以及如何解决?

编辑#1

进一步的研究表明, DataTable是罪魁祸首。 DataSet也有问题。 我唯一可以看到的是这些类型的独特之处在于它们继承自MarshalByValueComponent ,它上面有一个TypeConverterAttribute TypeConverter可能会影响XAML序列化绑定器并导致问题,从而表明WF 4.5中存在错误。 但是,我犹豫是否说这是一个错误。

似乎没有Dictionary<TKey, DataTable>可以通过设计师在WF 4.5中传递。

编辑#2

它似乎可能与DataTable ,也可能没有。 你也无法传递Dictionary<IEdmEntityType, object>

为了尝试使用System.Data以外的类而不是System.Object重现该问题,我创建了一个新的工作流项目。

我创建了自己的接口,类和结构,以查看是否有任何东西会触发它再次中断。

而不是使用IEdmEntityType ,我做了IMyInterface这是刚刚定义为:

public interface IMyInterface
{
    int Id
    {
        get;
    }
}

MyStruct结构很好。 这是定义:

public struct MyStruct
{
    public int A;
    public int B;
}

MyClass类运行良好。 这是定义:

public class MyClass
{
    public int A;
    public int B;
}

具有自动属性和object引用的MyClassComplex也起作用。

public class MyClassComplex
{
    public int A
    {
        get;
        private set;
    }

    public int B
    {
        get;
        private set;
    }

    public object C
    {
        get;
        private set;
    }
}

我最初也认为它可能与DataTableDataSet之间的公共属性有关,所以我将它们添加到MyClassComplex ,但它仍然工作正常。

另外,我让MyClassComplex继承了MarshalByValueComponent ,没有奇怪的交互,再也没有错误。

我接受了同样的项目并简单地将我的变量设置为Dictionary<IMyInterface, DataTable>并将CodeActivity<IMyInterface, MyClassComplex>更改为CodeActivity<IMyInterface, MyClassComplex> CodeActivity<IMyInterface, DataTable> ,并且它给出了与我原来的非测试项目相同的错误。

编辑#3

由于我已经在单独的项目和同事的机器上对此进行了测试并重现了该问题,并且没有文档支持为什么这不起作用,我已经提交了有关MS Connect错误报告

显然,Windows Workflow Foundation包含特定版本的Microsoft.Data.OData并且将ODataLib NuGet包添加到项目与之冲突。 我搜索了最初包含引用的位置,事实证明它是在代码生成期间默默添加的,作为工作流设计器代码生成过程的一部分。

在客户端没有任何错误表明某些程序集版本冲突。 据我所知,没有办法解决这个问题。 微软已经将该机票关闭为“按设计”。

只是为了简化案例,如果您尝试将double value / variable赋值给double变量,也会发生这种情况。 它在4.5之前工作但现在却没有。

未触及的Wf定义只是停止升级框架。

我们已经解决了手动修改.xaml从x:Object到x:来自Assign活动的Target和Origin变量的两倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM