1: [AttributeUsage(AttributeTargets.Method)]
2: public class STAOperationBehavior : Attribute, System.ServiceModel.Description.IOperationBehavior
3: { 4: //- @AddBindingParameters -//
5:
6: public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
7: { 8: //+ blank
9: }
10:
11: //- @ApplyClientBehavior -//
12: public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
13: { 14: }
15:
16: //- @ApplyDispatchBehavior -//
17: public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
18: { 19: dispatchOperation.Invoker = new STAInvoker(dispatchOperation.Invoker);
20: }
21:
22: //- @Validate -//
23: public void Validate(OperationDescription operationDescription)
24: { 25: //+ blank
26: }
27: }
28:
29:
30: public class STAInvoker : System.ServiceModel.Dispatcher.IOperationInvoker
31: { 32: //- $InnerOperationInvoker -//
33:
34: private IOperationInvoker InnerOperationInvoker { get; set; } 35: //+
36:
37: //- @Ctor -//
38: public STAInvoker(IOperationInvoker operationInvoker)
39: { 40: this.InnerOperationInvoker = operationInvoker;
41: }
42:
43: //+
44: //- @AllocateInputs -//
45: public Object[] AllocateInputs()
46: { 47: return InnerOperationInvoker.AllocateInputs();
48: }
49:
50: //- @Invoke -//
51: public Object Invoke(Object instance, Object[] inputs, out Object[] outputs)
52: { 53: Object result = null;
54: Object[] staOutputs = null;
55:
56: System.ServiceModel.OperationContext context = System.ServiceModel.OperationContext.Current;
57: System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate
58: { 59: using (System.ServiceModel.OperationContextScope scope = new System.ServiceModel.OperationContextScope(context))
60: { 61: result = InnerOperationInvoker.Invoke(instance, inputs, out staOutputs);
62: }
63: }));
64:
65: thread.SetApartmentState(System.Threading.ApartmentState.STA);
66: thread.Start();
67: thread.Join();
68: //+
69: outputs = staOutputs;
70: //+
71: return result;
72: }
73:
74: //- @InvokeBegin -//
75: public IAsyncResult InvokeBegin(Object instance, Object[] inputs, AsyncCallback callback, Object state)
76: { 77: return InnerOperationInvoker.InvokeBegin(instance, inputs, callback, state);
78: }
79:
80: //- @InvokeEnd -//
81: public Object InvokeEnd(Object instance, out Object[] outputs, IAsyncResult result)
82: { 83: return InnerOperationInvoker.InvokeEnd(instance, out outputs, result);
84: }
85:
86: //- @IsSynchronous -//
87: public bool IsSynchronous
88: { 89: get { return InnerOperationInvoker.IsSynchronous; } 90: }
91: }
92:
now decorate you service methode with "STAOperationBehavior" attribute,
and then it should work with controls that require STA.