C# Remoting的一个简单例子
.Net对于远程调用提供了两种方法:Remoting和WebService。
WebService现在是如火如荼,特别是有一种比较流行的架构:Winform+WebService(Java、.Net),
我曾经做过的一个项目就是这样子的,分布式、跨平台、极佳的用户体验,这三者结合起来是不是很诱人?
不过,这里我只说Remoting,Remoting具有以下特点:
1、Tcp通道的Remoting速度非常快
2、虽然是远程的,但是非常接近于本地调用对象
3、可以做到保持对象的状态
4、没有应用程序限制,可以是控制台,winform,iis,windows服务承载远程对象
缺点:
1、不是标准的应用,因此有平台限制
2、脱离iis的话需要有自己的安全机制
可以看出来,比起WebService,Remoting更适合于中小型局域网应用,而不适用于企业级的应用。
下面给出一个极其简单的Sample:
Remoting用的对象:
1
namespace RemoteSample
2
{
3
public class RemoteObject : System.MarshalByRefObject
4
{
5
public RemoteObject()
6
{
7
System.Console.WriteLine("New Referance Added!");
8
}
9
10
public int sum(int a, int b)
11
{
12
return a + b;
13
}
14
}
15
}
将其编译为一个lib文件:csc /t:library RemoteObject.cs
2

3

4

5

6

7

8

9

10

11

12

13

14

15

Server端:
1
using System;
2
using System.Runtime;
3
using System.Runtime.Remoting;
4
using System.Runtime.Remoting.Channels;
5
using System.Runtime.Remoting.Channels.Tcp;
6
using RemoteSample;
7
8
namespace RemoteSampleServer
9
{
10
public class RemoteServer
11
{
12
public static void Main(String[] args)
13
{
14
TcpServerChannel channel = new TcpServerChannel(6666);
15
ChannelServices.RegisterChannel(channel);
16
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject),
17
"RemoteObject", WellKnownObjectMode.SingleCall);
18
System.Console.WriteLine("Press Any Key");
19
System.Console.ReadLine();
20
}
21
}
22
}
将其编译为一个exe文件:csc /r:System.Runtime.Remoting.dll /r:RemoteObject.dll RemoteServer.cs
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Client端:
1
using System;
2
using System.Runtime.Remoting;
3
using System.Runtime.Remoting.Channels;
4
using System.Runtime.Remoting.Channels.Tcp;
5
using RemoteSample;
6
7
namespace RemoteSampleClient
8
{
9
public class RemoteClient
10
{
11
public static void Main(string[] args)
12
{
13
ChannelServices.RegisterChannel(new TcpClientChannel());
14
RemoteObject remoteobj = (RemoteObject)Activator.GetObject(typeof(RemoteObject),
15
"tcp://localhost:6666/RemoteObject");
16
Console.WriteLine("1 + 2 = " + remoteobj.sum(1,2).ToString());
17
Console.ReadLine();
18
}
19
}
20
}
同样的,将其编译为exe文件:csc /r:System.Runtime.Remoting.dll /r:RemoteObject.dll RemoteClient.cs
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

好了,一次运行生成的RemoteServer.exe和RemoteClient.exe,你就会发现原来Remoting是这样简单。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)