【问题标题】:Workflow Foundation (WF) -- Why does setting a DependencyProperty to a COM object using SetValue() throw an ArgumentException?Workflow Foundation (WF) - 为什么使用 SetValue() 将 DependencyProperty 设置为 COM 对象会引发 ArgumentException?
【发布时间】:2010-04-15 20:43:37
【问题描述】:

假设我有一个具有以下“输出”属性的 .NET Workflow Foundation (WF) SequenceActivity 类:

public IWorkspace Workspace { get; private set; }
//     ^^^^^^^^^^
//     important: this is a COM interface type!

public static DependencyProperty WorkspaceProperty = DependencyProperty.Register(
        "Workspace",
        typeof(IWorkspace),
        typeof(FoobarActivity));   // <-- this activity class

这个活动执行一些代码,像这样设置上述两个:

this.Workspace = ...;   // exact code not relevant; property set to a COM object
SetValue(WorkspaceProperty, this.Workspace);

最后一行(调用SetValue)为第二个参数(值为this.Workspace)生成ArgumentException

依赖属性 Workspace 的类型 […].IWorkspace 与值的类型 System.__ComObject 不匹配。
(翻译自德语,英文异常文本可能略有不同)

只要我使用typeof(object) 而不是typeof(IWorkspace) 作为第二个参数注册依赖属性,代码就可以正常执行。但是,这将导致为依赖属性分配几乎任何值的可能性,我不希望这样。

在我看来,WF 依赖属性不适用于 COM 互操作对象。
有人对此有解决方案吗?

【问题讨论】:

  • 顺便说一句,转移到 .NET 4.0 并使用 dynamic(这可能解决问题)目前不是一种选择。

标签: .net-3.5 com workflow-foundation com-interop


【解决方案1】:

为了对我自己的问题给出第一个答案,我发现这个变通方法可行:

如果 COM 对象包装在 .NET 对象中,Workflow Foundation 将能够处理它。


(1)首先定义一个通用的辅助类:

public class Wrapped<T>
{
    T Value { get; set; }

    public Wrapped(T init)
    {
        Value = init;
    }
}

(2)然后,将上面的activity属性定义改为:

public Wrapped<IWorkspace> Workspace { get; private set; }
//     ^^^^^^^^^^^^^^^^^^^
//     this is now a .NET class type wrapping a COM object instance.

public static DependencyProperty WorkspaceProperty = DependencyProperty.Register(
        "Workspace",
        typeof(Wrapped<IWorkspace>),
        typeof(FoobarActivity));

(3) 最后,Workspace 属性的赋值现在变为:

this.Workspace = new Wrapped<IWorkspace>(...);

虽然这工作得很好,但它仍然只是一种解决方法。
如果有人有更优雅的解决方案,我很想听听。

【讨论】:

    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 2015-08-28
    • 2010-09-09
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2020-07-05
    相关资源
    最近更新 更多