diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj index 069bc6ff6c..7455120871 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj @@ -82,9 +82,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAClientChannelSink.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAClientChannelSink.cs new file mode 100644 index 0000000000..5065312e6a --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAClientChannelSink.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Remoting.Channels; +using System.Windows.Forms; +using System.Runtime.Remoting.Messaging; +using System.IO; +using System.Threading; + +namespace CustomSinks +{ + class InvokeOnSTAClientChannelSink : BaseChannelSinkWithProperties, IClientFormatterSink + { + IClientFormatterSink nextSink; + + public InvokeOnSTAClientChannelSink(IClientFormatterSink nextSink) + { + this.nextSink = nextSink; + } + + + // IClientChannelSink Members + + void IClientChannelSink.AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream) + { + nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream); + } + + void IClientChannelSink.AsyncProcessResponse(IClientResponseChannelSinkStack sinkStack, object state, ITransportHeaders headers, Stream stream) + { + nextSink.AsyncProcessResponse(sinkStack, state, headers, stream); + } + + Stream IClientChannelSink.GetRequestStream(IMessage msg, ITransportHeaders headers) + { + return nextSink.GetRequestStream(msg, headers); + } + + IClientChannelSink IClientChannelSink.NextChannelSink { + get { + return nextSink; + } + } + + void IClientChannelSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream) + { + nextSink.ProcessMessage(msg, requestHeaders, requestStream, out responseHeaders, out responseStream); + } + + // IMessageSink Members + + IMessageCtrl IMessageSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink) + { + return nextSink.AsyncProcessMessage(msg, replySink); + } + + IMessageSink IMessageSink.NextSink { + get { + return nextSink; + } + } + + IMessage IMessageSink.SyncProcessMessage(IMessage msg) + { + IMessage response = null; + Thread thread = new Thread(new ThreadStart(delegate { + response = nextSink.SyncProcessMessage(msg); + })); + + thread.Start(); + + while (thread.IsAlive) Application.DoEvents(); + + return response; + } + + // IChannelSinkBase Members + + System.Collections.IDictionary IChannelSinkBase.Properties { + get { + return this.Properties; + } + } +} +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAClientChannelSinkProvider.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAClientChannelSinkProvider.cs new file mode 100644 index 0000000000..ce6302e9f6 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAClientChannelSinkProvider.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Remoting.Channels; +using System.Collections; + +namespace CustomSinks +{ + class InvokeOnSTAClientChannelSinkProvider: IClientChannelSinkProvider + { + private IClientChannelSinkProvider nextProvider; + + public InvokeOnSTAClientChannelSinkProvider(IDictionary properties, ICollection providerData) + { + } + + IClientChannelSink IClientChannelSinkProvider.CreateSink(IChannelSender channel, string url, object remoteChannelData) + { + IClientChannelSink nextSink = nextProvider.CreateSink(channel, url, remoteChannelData); + IClientChannelSink thisSink = new InvokeOnSTAClientChannelSink(nextSink as IClientFormatterSink); + return thisSink; + } + + IClientChannelSinkProvider IClientChannelSinkProvider.Next { + get { + return nextProvider; + } + set { + nextProvider = value; + } + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAServerChannelSink.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAServerChannelSink.cs new file mode 100644 index 0000000000..2ef0a49bfa --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAServerChannelSink.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Remoting.Channels; +using System.Windows.Forms; +using System.Runtime.Remoting.Messaging; +using System.IO; + +namespace CustomSinks +{ + class InvokeOnSTAServerChannelSink: BaseChannelSinkWithProperties, IServerChannelSink + { + IServerChannelSink nextSink; + + public InvokeOnSTAServerChannelSink(IServerChannelSink nextSink) + { + this.nextSink = nextSink; + } + + void IServerChannelSink.AsyncProcessResponse(IServerResponseChannelSinkStack sinkStack, object state, System.Runtime.Remoting.Messaging.IMessage msg, ITransportHeaders headers, System.IO.Stream stream) + { + nextSink.AsyncProcessResponse(sinkStack, state, msg, headers, stream); + } + + System.IO.Stream IServerChannelSink.GetResponseStream(IServerResponseChannelSinkStack sinkStack, object state, System.Runtime.Remoting.Messaging.IMessage msg, ITransportHeaders headers) + { + return nextSink.GetResponseStream(sinkStack, state, msg, headers); + } + + IServerChannelSink IServerChannelSink.NextChannelSink { + get { + return nextSink; + } + } + + ServerProcessing IServerChannelSink.ProcessMessage(IServerChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage requestMsg, ITransportHeaders requestHeaders, System.IO.Stream requestStream, out System.Runtime.Remoting.Messaging.IMessage responseMsg, out ITransportHeaders responseHeaders, out System.IO.Stream responseStream) + { + if (Application.OpenForms.Count > 0) { + IMessage outResponseMsg = null; + ITransportHeaders outResponseHeaders = null; + Stream outResponseStream = null; + ServerProcessing returnValue = ServerProcessing.Complete; + Application.OpenForms[0].Invoke(new EventHandler(delegate + { + returnValue = nextSink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out outResponseMsg, out outResponseHeaders, out outResponseStream); + })); + responseMsg = outResponseMsg; + responseHeaders = outResponseHeaders; + responseStream = outResponseStream; + return returnValue; + } else { + return nextSink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); + } + } + + System.Collections.IDictionary IChannelSinkBase.Properties { + get { + return this.Properties; + } + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAServerChannelSinkProvider.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAServerChannelSinkProvider.cs new file mode 100644 index 0000000000..49b8be49ac --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTAServerChannelSinkProvider.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Remoting.Channels; +using System.Collections; + +namespace CustomSinks +{ + class InvokeOnSTAServerChannelSinkProvider: IServerChannelSinkProvider + { + private IServerChannelSinkProvider nextProvider; + + public InvokeOnSTAServerChannelSinkProvider(IDictionary properties, ICollection providerData) + { + } + + IServerChannelSink IServerChannelSinkProvider.CreateSink(IChannelReceiver channel) + { + IServerChannelSink nextSink = nextProvider.CreateSink(channel); + IServerChannelSink thisSink = new InvokeOnSTAServerChannelSink(nextSink); + return thisSink; + } + + void IServerChannelSinkProvider.GetChannelData(IChannelDataStore channelData) + { + } + + IServerChannelSinkProvider IServerChannelSinkProvider.Next { + get { + return nextProvider; + } + set { + nextProvider = value; + } + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTASink.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTASink.csproj new file mode 100644 index 0000000000..2afef0b6b9 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/InvokeOnSTASink/InvokeOnSTASink.csproj @@ -0,0 +1,33 @@ + + + Library + InvokeOnSTASink + InvokeOnSTASink + Debug + AnyCPU + {068578FE-412A-48DC-B90C-B7D2B8593DB4} + + + bin\Debug\ + false + DEBUG;TRACE + + + bin\Release\ + true + TRACE + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/EventForwarder.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/EventForwarder.cs new file mode 100644 index 0000000000..a826950b08 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/EventForwarder.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CustomSinks +{ + public class EventForwarder:MarshalByRefObject + { + Delegate realEvent; + + public EventForwarder(Delegate realEvent) + { + this.realEvent = realEvent; + } + + public void ForwardEvent0() + { + realEvent.DynamicInvoke(new object[] {}); + } + + public void ForwardEvent1(object p1) + { + realEvent.DynamicInvoke(new object[] { p1}); + } + + public void ForwardEvent2(object p1, object p2) + { + realEvent.DynamicInvoke(new object[] { p1, p2}); + } + + public void ForwardEvent3(object p1, object p2, object p3) + { + realEvent.DynamicInvoke(new object[] { p1, p2, p3}); + } + + public void ForwardEvent4(object p1, object p2, object p3, object p4) + { + realEvent.DynamicInvoke(new object[] { p1, p2, p3, p4}); + } + + public void ForwardEvent5(object p1, object p2, object p3, object p4, object p5) + { + realEvent.DynamicInvoke(new object[] { p1, p2, p3, p4, p5}); + } + + public void ForwardEvent6(object p1, object p2, object p3, object p4, object p5, object p6) + { + realEvent.DynamicInvoke(new object[] { p1, p2, p3, p4, p5, p6}); + } + + public void ForwardEvent7(object p1, object p2, object p3, object p4, object p5, object p6, object p7) + { + realEvent.DynamicInvoke(new object[] { p1, p2, p3, p4, p5, p6, p7}); + } + + public void ForwardEvent8(object p1, object p2, object p3, object p4, object p5, object p6, object p7, object p8) + { + realEvent.DynamicInvoke(new object[] { p1, p2, p3, p4, p5, p6, p7, p8}); + } + + public void ForwardEvent9(object p1, object p2, object p3, object p4, object p5, object p6, object p7, object p8, object p9) + { + realEvent.DynamicInvoke(new object[] { p1, p2, p3, p4, p5, p6, p7, p8, p9}); + } + + public void ForwardEvent10(object p1, object p2, object p3, object p4, object p5, object p6, object p7, object p8, object p9, object p10) + { + realEvent.DynamicInvoke(new object[] { p1, p2, p3, p4, p5, p6, p7, p8, p9, p10}); + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersClientChannelSink.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersClientChannelSink.cs new file mode 100644 index 0000000000..28c16d96ea --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersClientChannelSink.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Remoting.Channels; +using System.Windows.Forms; +using System.Runtime.Remoting.Messaging; +using System.IO; +using System.Threading; +using System.Reflection; + +namespace CustomSinks +{ + class PrivateEventHandlersClientChannelSink : BaseChannelSinkWithProperties, IClientFormatterSink + { + IClientFormatterSink nextSink; + + public PrivateEventHandlersClientChannelSink(IClientFormatterSink nextSink) + { + this.nextSink = nextSink; + } + + + // IClientChannelSink Members + + void IClientChannelSink.AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders headers, Stream stream) + { + nextSink.AsyncProcessRequest(sinkStack, msg, headers, stream); + } + + void IClientChannelSink.AsyncProcessResponse(IClientResponseChannelSinkStack sinkStack, object state, ITransportHeaders headers, Stream stream) + { + nextSink.AsyncProcessResponse(sinkStack, state, headers, stream); + } + + Stream IClientChannelSink.GetRequestStream(IMessage msg, ITransportHeaders headers) + { + return nextSink.GetRequestStream(msg, headers); + } + + IClientChannelSink IClientChannelSink.NextChannelSink { + get { + return nextSink; + } + } + + void IClientChannelSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream) + { + nextSink.ProcessMessage(msg, requestHeaders, requestStream, out responseHeaders, out responseStream); + } + + // IMessageSink Members + + IMessageCtrl IMessageSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink) + { + return nextSink.AsyncProcessMessage(msg, replySink); + } + + IMessageSink IMessageSink.NextSink { + get { + return nextSink; + } + } + + IMessage IMessageSink.SyncProcessMessage(IMessage msg) + { + MethodCall methodCall = new MethodCall(msg); + if (methodCall.ArgCount > 0 && methodCall.Args[0] is Delegate) { + Delegate realDelegate = methodCall.Args[0] as Delegate; + Type type = realDelegate.GetType(); + EventForwarder eventForwarder = new EventForwarder(realDelegate); + MethodInfo proxyMethod = typeof(EventForwarder).GetMethod("ForwardEvent" + realDelegate.Method.GetParameters().Length); + Delegate proxyDelegate = Delegate.CreateDelegate(type, eventForwarder, proxyMethod); + methodCall.Args[0] = proxyDelegate; + } + + return nextSink.SyncProcessMessage(methodCall); + } + + // IChannelSinkBase Members + + System.Collections.IDictionary IChannelSinkBase.Properties { + get { + return this.Properties; + } + } +} +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersClientChannelSinkProvider.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersClientChannelSinkProvider.cs new file mode 100644 index 0000000000..0dd4cb7d3e --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersClientChannelSinkProvider.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Remoting.Channels; +using System.Collections; + +namespace CustomSinks +{ + class PrivateEventHandlersClientChannelSinkProvider: IClientChannelSinkProvider + { + private IClientChannelSinkProvider nextProvider; + + public PrivateEventHandlersClientChannelSinkProvider(IDictionary properties, ICollection providerData) + { + } + + IClientChannelSink IClientChannelSinkProvider.CreateSink(IChannelSender channel, string url, object remoteChannelData) + { + IClientChannelSink nextSink = nextProvider.CreateSink(channel, url, remoteChannelData); + IClientChannelSink thisSink = new PrivateEventHandlersClientChannelSink(nextSink as IClientFormatterSink); + return thisSink; + } + + IClientChannelSinkProvider IClientChannelSinkProvider.Next { + get { + return nextProvider; + } + set { + nextProvider = value; + } + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersSink.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersSink.csproj new file mode 100644 index 0000000000..ec828bf252 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/PrivateEventHandlersSink/PrivateEventHandlersSink.csproj @@ -0,0 +1,31 @@ + + + Library + PrivateEventHandlersSink + PrivateEventHandlersSink + Debug + AnyCPU + {6AF77F6A-775A-45DF-97B8-AAD76CD4023B} + + + bin\Debug\ + false + DEBUG;TRACE + + + bin\Release\ + true + TRACE + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/RemotingSinks.sln b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/RemotingSinks.sln new file mode 100644 index 0000000000..259e2512c0 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/RemotingSinks.sln @@ -0,0 +1,14 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# SharpDevelop 2.0.0.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InvokeOnSTASink", "InvokeOnSTASink\InvokeOnSTASink.csproj", "{068578FE-412A-48DC-B90C-B7D2B8593DB4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrivateEventHandlersSink", "PrivateEventHandlersSink\PrivateEventHandlersSink.csproj", "{6AF77F6A-775A-45DF-97B8-AAD76CD4023B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestClient", "TestClient\TestClient.csproj", "{2DDD7699-76DC-492D-85A6-BB3B5CBB5FC3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestCommonTypes", "TestCommonTypes\TestCommonTypes.csproj", "{C2A2838E-E87F-47C3-9440-556875E1BB5E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestServer", "TestServer\TestServer.csproj", "{1EE49A1D-7098-4B75-B174-B36C803EA9EB}" +EndProject +Global +EndGlobal diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/Client.exe.config b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/Client.exe.config new file mode 100644 index 0000000000..c58a741fca --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/Client.exe.config @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/FormClient.Designer.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/FormClient.Designer.cs new file mode 100644 index 0000000000..91811187b2 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/FormClient.Designer.cs @@ -0,0 +1,88 @@ +namespace CustomSinks +{ + partial class FormClient + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.buttonSend = new System.Windows.Forms.Button(); + this.textBoxInput = new System.Windows.Forms.TextBox(); + this.richTextBoxChat = new System.Windows.Forms.RichTextBox(); + this.SuspendLayout(); + // + // buttonSend + // + this.buttonSend.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSend.Location = new System.Drawing.Point(184, 158); + this.buttonSend.Name = "buttonSend"; + this.buttonSend.Size = new System.Drawing.Size(75, 23); + this.buttonSend.TabIndex = 0; + this.buttonSend.Text = "Send"; + this.buttonSend.Click += new System.EventHandler(this.buttonSend_Click); + // + // textBoxInput + // + this.textBoxInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBoxInput.Location = new System.Drawing.Point(2, 158); + this.textBoxInput.Name = "textBoxInput"; + this.textBoxInput.Size = new System.Drawing.Size(176, 26); + this.textBoxInput.TabIndex = 1; + // + // richTextBoxChat + // + this.richTextBoxChat.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextBoxChat.Location = new System.Drawing.Point(2, 2); + this.richTextBoxChat.Name = "richTextBoxChat"; + this.richTextBoxChat.Size = new System.Drawing.Size(257, 150); + this.richTextBoxChat.TabIndex = 2; + this.richTextBoxChat.Text = ""; + // + // FormClient + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(262, 188); + this.Controls.Add(this.richTextBoxChat); + this.Controls.Add(this.textBoxInput); + this.Controls.Add(this.buttonSend); + this.Name = "FormClient"; + this.Text = "Client"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonSend; + private System.Windows.Forms.TextBox textBoxInput; + private System.Windows.Forms.RichTextBox richTextBoxChat; + } +} + diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/FormClient.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/FormClient.cs new file mode 100644 index 0000000000..1eccb3eacb --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/FormClient.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Runtime.Remoting; + +namespace CustomSinks +{ + public partial class FormClient : Form + { + ChatServer chatServer; + + public FormClient() + { + InitializeComponent(); + RemotingConfiguration.Configure("Client.exe.config"); + chatServer = new ChatServer(); + chatServer.NewMessage += + delegate(object sender, TextMessageEventArgs args) + { + richTextBoxChat.AppendText(args.Message + "\r\n"); + }; + } + + private void buttonSend_Click(object sender, EventArgs e) + { + chatServer.SendMessage(textBoxInput.Text); + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/Program.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/Program.cs new file mode 100644 index 0000000000..f4bd406abd --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/Program.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using System.Runtime.Remoting; +using System.Threading; + +namespace CustomSinks +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Thread.CurrentThread.Name = "Client (STA)"; + + Application.EnableVisualStyles(); + Application.Run(new FormClient()); + } + } +} \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/TestClient.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/TestClient.csproj new file mode 100644 index 0000000000..363dbcfa9e --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestClient/TestClient.csproj @@ -0,0 +1,53 @@ + + + WinExe + TestClient + TestClient + Debug + AnyCPU + {2DDD7699-76DC-492D-85A6-BB3B5CBB5FC3} + + + + + + bin\Debug\ + false + DEBUG;TRACE + + + bin\Release\ + true + TRACE + + + + + + + + + + + + + + Always + + + + + {C2A2838E-E87F-47C3-9440-556875E1BB5E} + TestCommonTypes + + + {6AF77F6A-775A-45DF-97B8-AAD76CD4023B} + PrivateEventHandlersSink + + + {068578FE-412A-48DC-B90C-B7D2B8593DB4} + InvokeOnSTASink + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/ChatServer.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/ChatServer.cs new file mode 100644 index 0000000000..ec76361aed --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/ChatServer.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CustomSinks +{ + public class ChatServer: MarshalByRefObject + { + public event TextMessageEventHandler NewMessage; + + public void SendMessage(string message) + { + Console.WriteLine("Message received:" + message); + if (NewMessage != null) { + NewMessage(this, new TextMessageEventArgs(message)); + } + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/TestCommonTypes.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/TestCommonTypes.csproj new file mode 100644 index 0000000000..308543c6b3 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/TestCommonTypes.csproj @@ -0,0 +1,29 @@ + + + Library + TestCommonTypes + TestCommonTypes + Debug + AnyCPU + {C2A2838E-E87F-47C3-9440-556875E1BB5E} + + + bin\Debug\ + false + DEBUG;TRACE + + + bin\Release\ + true + TRACE + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/TextMessageEventArgs.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/TextMessageEventArgs.cs new file mode 100644 index 0000000000..52b8ff478b --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestCommonTypes/TextMessageEventArgs.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CustomSinks +{ + public delegate void TextMessageEventHandler (object sender, TextMessageEventArgs args); + + [Serializable] + public class TextMessageEventArgs : EventArgs + { + string message; + + public TextMessageEventArgs(string message) + { + this.message = message; + } + + public string Message { + get { + return message; + } + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/Program.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/Program.cs new file mode 100644 index 0000000000..511cee75b9 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Remoting; +using System.Threading; + +namespace CustomSinks +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Thread.CurrentThread.Name = "Server (STA)"; + + RemotingConfiguration.Configure("Server.exe.config"); + + Console.WriteLine("Chat server started. Press ENTER to exit."); + Console.ReadLine(); + } + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/Server.exe.config b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/Server.exe.config new file mode 100644 index 0000000000..6699708e22 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/Server.exe.config @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/TestServer.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/TestServer.csproj new file mode 100644 index 0000000000..f6383198d4 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/RemotingSinks/TestServer/TestServer.csproj @@ -0,0 +1,46 @@ + + + Exe + TestServer + TestServer + Debug + AnyCPU + {1EE49A1D-7098-4B75-B174-B36C803EA9EB} + + + bin\Debug\ + false + DEBUG;TRACE + + + bin\Release\ + true + TRACE + + + + + + + + + + Always + + + + + {C2A2838E-E87F-47C3-9440-556875E1BB5E} + TestCommonTypes + + + {6AF77F6A-775A-45DF-97B8-AAD76CD4023B} + PrivateEventHandlersSink + + + {068578FE-412A-48DC-B90C-B7D2B8593DB4} + InvokeOnSTASink + + + + \ No newline at end of file