gpt4 book ai didi

c# - 在 C# 中发送要在服务器上执行的代码 - 就像 Java RMI

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:09 25 4
gpt4 key购买 nike

这是 java 中的示例代码。

共享接口(interface):

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Compute extends Remote {
public Object executeTask(Task t) throws RemoteException;
}

任务(这将作为参数传递):

import java.io.Serializable;

public interface Task extends Serializable {
public Object execute();
}

服务器:

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class ComputeEngine extends UnicastRemoteObject implements Compute {

public ComputeEngine() throws RemoteException {
super();
}

public Object executeTask(Task t) {
return t.execute();
}

public static void main(String[] args) {
setRmiCodebase();
System.setSecurityManager(new RMISecurityManager());
try {
Compute engine = new ComputeEngine();
Naming.rebind("//localhost:1099/Compute", engine);
System.out.println("ComputeEngine started.");
} catch (Exception ex) {
ex.printStackTrace();
}
}

private static void setRmiCodebase() {
String codebase = System.getProperty("java.rmi.server.codebase");
if (codebase != null)
return;
// set codebase based on location of this clsas (is it in jar or filesistem?)
}

}

客户:

import java.math.BigDecimal;
/**
* Calculates Pi to arbitrary number of digits:
*/
public class Pi implements Task {

public Pi(int digits) {
this.digits = digits;
}

public Object execute() {
return computePi(digits);
}

public static BigDecimal computePi(int digits) {
// compute Pi
}

}

客户端主要:

import java.math.BigDecimal;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;

public class ComputePi {

public static void main(String[] args) {
setRmiCodebase();
System.setSecurityManager(new RMISecurityManager());
try {
Compute comp = (Compute)Naming.lookup("//localhost:1099/Compute");
Pi task = new Pi(100);
BigDecimal pi = (BigDecimal)comp.executeTask(task);
System.out.println(pi);
} catch (Exception ex) {
ex.printStackTrace();
}
}

private static void setRmiCodebase() {
String codebase = System.getProperty("java.rmi.server.codebase");
if (codebase != null)
return;
// set codebase based on location of this clsas (is it in jar or filesistem?)
}
}

如您所见,来自客户端的代码(不仅仅是数据)被传输到服务器并在那里执行并返回计算结果。服务器不知道Pi类的存在,它只知道Task接口(interface)。

我需要这样的东西才能在 .net 环境中工作(C# 如果它很重要)。 WCF 会很好,但我正在寻找最直接的解决方案,因此 WCF 不是强制性的。我什至不确定使用什么关键字来谷歌文档或解决方案。

任何帮助将不胜感激。

最佳答案

Afaik .NET 不支持开箱即用 - 您可以进行远程处理,但不会(按原样)让您从服务器上的客户端运行代码。我认为你必须实现一些东西,将包含你要执行的代码的 dll 传输到服务器,然后可能将该 dll 加载到一个单独的 AppDomain 中(因为你不能卸载 dll,除非你将它们加载到一个单独的 AppDomain 中) , 然后有办法指定要运行的类。

关于c# - 在 C# 中发送要在服务器上执行的代码 - 就像 Java RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10833550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com