2010-04-15 29 views
1

假設我有一個.NET工作流基礎(WF)SequenceActivity類下面的「輸出」屬性:Workflow Foundation(WF) - 爲什麼使用SetValue()將一個DependencyProperty設置爲一個COM對象會引發一個ArgumentException?

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)在ArgumentException結果用於第二帕ameter(具有this.Workspace值):

依賴屬性Workspace[…].IWorkspace類型不匹配值的類型System.__ComObject
                                                                                 當我註冊依賴屬性與typeof(object)代替typeof(IWorkspace)作爲第二個參數(德國翻譯,英文異常文本可能稍有不同)

,代碼執行就好了。但是,這將導致可能性將任何值分配給依賴項屬性,而我不希望這樣做。

在我看來,WF依賴項屬性不適用於COM互操作對象。
有沒有人有解決方案?

+0

順便說一句,轉移到.NET 4.0並使用'動態'(它*可能*解決問題)目前不是一種選擇。 – stakx 2010-04-19 07:20:15

回答

1

授予第一個答案,以我自己的問題,我發現這個變通的工作:

如果COM對象被包裹在一個.NET對象,工作流基礎將能對付它。


(1)首先定義一個通用的輔助類:

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

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

(2)然後,將上述活動的屬性定義更改爲:

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>(...); 

雖然這工作得很好,它仍然只是一種變通方法。
如果有人有更優雅的解決方案,我很樂意聽到它。

相關問題