CSDN - 技术社区 - .NET技术 C# 
回复 | 收藏此页 | 专题 | 公告 | 管理 | 保存 | 关闭窗口 
主  题:  (50分)C#如何实现本地的两个程序间的通讯? 
作  者:  alice_art (柔风清清)        Blog  加为好友 
等  级:   
信 誉 值:  100 
所属社区:  .NET技术 C# 
问题点数:  50 
回复次数:  22 
发表时间:  2007-4-14 16:27:27 
一个是WebForm,一个是WinForm,我想让他们进行相互通信,能实现吗?通信的目的有两点:
1、激活对方程序中的事件。
2、主动向对方传递字符串,以备用。
3、获取对方程序中公开的字符串。
本人对程序间通信不是很熟,还请各位高手提供一下源代码。
zhangliu_521(浪客) ( ) 信誉:100    Blog  加为好友  2007-4-14 16:41:40  得分: 0 
先做个简单的P2P先.
再在基础上添加功能
Top 
alice_art(柔风清清) ( ) 信誉:100    Blog  加为好友  2007-4-14 18:16:52  得分: 0 
自己再顶一下
Top 
alldj(灵山妖姬) ( ) 信誉:100    Blog  加为好友  2007-4-14 18:20:48  得分: 0 
weebservices,remoting,xml,三种方法都能实现。
Top 
cwwhy() ( ) 信誉:98    Blog  加为好友  2007-4-14 18:40:56  得分: 0 
weebservices,socket,xml,remoting四种方法都能实现。
Top 
alice_art(柔风清清) ( ) 信誉:100    Blog  加为好友  2007-4-14 21:11:31  得分: 0 
有代码例子吗?劳驾!
Top 
siday2151(小溪哈哈) ( ) 信誉:100    Blog  加为好友  2007-4-14 21:54:02  得分: 0 
1、激活对方程序中的事件。
如何通过xml来激活对方程序的事件呢?
Top 
liberte() ( ) 信誉:100    Blog  加为好友  2007-4-15 0:13:29  得分: 0 
Remoting
Top 
qnzn() ( ) 信誉:100    Blog  加为好友  2007-4-15 0:20:22  得分: 0 
//---------------------------------------------------
//接受方
//---------------------------------------------------
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace WindowsFormGetMsg
{
public partial class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.ComponentModel.Container components = null;
const int WM_COPYDATA = 0x004A;
public Form1()
{
InitializeComponent();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// textBox1
/
/
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(432, 266);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.Name = "Form1";
this.Text = "接收方窗体";
this.ResumeLayout(false);
}
static void Main()
{
Application.Run(new Form1());
}
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
sendmessage 关闭窗口
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
break;
default:
base.DefWndProc(ref m);
break;
}
}
}
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
}
Top 
qnzn() ( ) 信誉:100    Blog  加为好友  2007-4-15 0:20:56  得分: 0 
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace WinFormSendMsg
{
public partial class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button1;
private System.ComponentModel.Container components = null;
const int WM_COPYDATA = 0x004A;
public Form1()
{
InitializeComponent();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
private void InitializeCompone
nt()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// textBox1
//
//
// button1
//
this.button1.Location = new System.Drawing.Point(344, 16);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(112, 32);
this.button1.TabIndex = 1;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(536, 142);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.button1,
this.Name = "Form1";
this.Text = "发送方窗体";
this.ResumeLayout(false);
}
static void Main()
{
Application.Run(new Form1());
}
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
ref COPYDATASTRUCT lParam // second message parameter
);
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string
lpWindowName);
private void button1_Click(object sender, System.EventArgs e)
{
int WINDOW_HANDLER = FindWindow(null, @"接收方窗体");
if (WINDOW_HANDLER == 0)
{
}
else
{
byte[] sarr = System.Text.Encoding.Default.Box1.Text);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = Box1.Text;
cds.cbData = len + 1;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
}
}
}
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
}
Top 
qnzn() ( ) 信誉:100    Blog  加为好友  2007-4-15 0:22:10  得分: 0 
以上使用WM_COPYDATA实现进程间通迅
Top 
zbking(刚来) ( ) 信誉:97    Blog  加为好友  2007-4-15 16:50:52  得分: 0 
mark
Top 
yq_net() ( ) 信誉:100    Blog  加为好友  2007-4-20 13:17:38  得分: 0 
学习
Top 
LeoMaya(postreetboy) ( ) 信誉:100    Blog  加为好友  2007-4-20 13:22:01  得分: 0 
mark
Top 
xioxu() ( ) 信誉:100    Blog  加为好友  2007-4-20 14:36:35  得分: 0 
好容易 使用API的SendMessage
Top 
xioxu() ( ) 信誉:100    Blog  加为好友  2007-4-20 14:37:14  得分: 0 
我看 看错了 有web程序 只好webservice了
Top 
DADA_dotnet(ASP.NET&C#) ( ) 信誉:98    Blog  加为好友  2007-4-20 14:38:15  得分: 0 
使用HttpWebRequest
Top 
pop_andy_feng(枫) ( ) 信誉:100    Blog  加为好友  2007-4-20 15:36:59  得分: 0 
标记下 估计也会遇到同样的问题
期待高人解决!
Top 
dixianming() ( ) 信誉:100    Blog  加为好友  2007-4-20 16:56:08  得分: 0 
socket
Top 
alice_art(柔风清清) ( ) 信誉:100    Blog  加为好友  2007-4-26 1:03:29  得分: 0 
我是楼主,补充说明:
还是没有解决,那种最简单的方法使asp与普通程序之间通讯呢?都是在本地运行的。希望能给原代码,谢谢。
或者能不能用以下过程写个代码参考下?
1、asp传一个数字给这个进程A;
2、进程A将收到的数字乘于999。
3、进程A将结果返回asp。
4、asp将结果显示在屏幕。
Top 
xzc5858(★★★★★) ( ) 信誉:100    Blog  加为好友  2007-4-26 1:08:34  得分: 0 
观注
Top 
a1b2c3dsi(帅帅的酷老头) ( ) 信誉:100    Blog  加为好友  2007-4-26 8:05:42  得分: 0 
remoting 就可以
Top 
wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴) ( ) 信誉:100    Blog  加为好友  2007-4-26 9:54:08  得分: 0 
用Remoting是最简单的实现!如果是在本机通讯的话,建议你使用IPC通道。它比TCP通道性能高很多!
Top 
管理 | 关闭窗口 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。