C# 远程执行操作<&燃气轮机;或Func<&燃气轮机;物体
我想使用WCF将操作或Func对象从C#client传输(并执行)到C#server应用程序 这是我的密码:C# 远程执行操作<&燃气轮机;或Func<&燃气轮机;物体,c#,wcf,network-programming,C#,Wcf,Network Programming,我想使用WCF将操作或Func对象从C#client传输(并执行)到C#server应用程序 这是我的密码: [ServiceContract] interface IRemoteExecuteServer { [OperationContract] void Execute(Action action); } class RemoteExecuteServer : IRemoteExecuteServer { public void Execute(Action ac
[ServiceContract]
interface IRemoteExecuteServer
{
[OperationContract]
void Execute(Action action);
}
class RemoteExecuteServer : IRemoteExecuteServer
{
public void Execute(Action action)
{
action();
}
}
服务器代码:
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(RemoteExecuteServer), new Uri("net.tcp://localhost:8000")))
{
host.AddServiceEndpoint(typeof(IRemoteExecuteServer), new NetTcpBinding(), "RES");
host.Open();
Console.WriteLine("Server is running!");
Console.WriteLine("Press any key to exit...");
Console.ReadKey(true);
host.Close();
}
}
}
客户代码:
class Program
{
static void Main(string[] args)
{
IRemoteExecuteServer server = new ChannelFactory<IRemoteExecuteServer>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000/RES")).CreateChannel();
server.Execute(delegate()
{
Console.WriteLine("Hello server!");
});
}
}
类程序
{
静态void Main(字符串[]参数)
{
IRemoteExecuteServer服务器=新的ChannelFactory(新的NetTcpBinding(),新的EndpointAddress(“net。tcp://localhost:8000/RES))创建通道();
server.Execute(委托()
{
WriteLine(“你好服务器!”);
});
}
}
当执行“server.Execute”行时,我得到一个通信异常。
有人知道如何修复此错误吗
谢谢你的帮助
这是我问的一个类似的问题
我也将它与您联系起来,因为eric lippert展示了这样一个解决方案是如何可能的
然而,这是一项相当可观的工作。
这是我问的一个类似的问题
我也将它与您联系起来,因为eric lippert展示了这样一个解决方案是如何可能的
然而,这是一项相当可观的工作。我会想到两种解决方案,它们的性质都非常疯狂。主要是因为您请求将代码发送到服务器以执行,这与人们每天都做的事情无关(我认为没有人做过类似的事情)
但您仍然无法从任何函数中提取代码。请记住,操作只不过是程序集中硬编码函数的委托(引用)。我会想到两种解决方案,它们的本质都非常疯狂。主要是因为您请求将代码发送到服务器以执行,这与人们每天都做的事情无关(我认为没有人做过类似的事情)
但您仍然无法从任何函数中提取代码。请记住,操作只不过是程序集中硬编码函数的委托(引用)。可能存在现有的解决方案,我不知道。(有一些非常漂亮的运行时字节码注入/操作工具可用,所以…) 但是,如果有足够的权限(以及信任级别!——这是一个很大的权限),用户可以动态编译和/或通过网络发送各种自我评估表达式(这与发送字节码本身不同,尽管理论上可以在提取字节码或等效代码的情况下完成) 上面的方法不是发送一个操作,它需要提取字节码进行序列化(包括捕获上下文,如果有的话),而是类似这样的操作,您可以进行有趣的讨论并最终找到它
另一方面,LINQ“了解”使用的字节码提取/反编译问题。请注意,它不发送字节码,而是使用此方法允许远程执行表达式树(常见的是SQL查询)。可能存在现有的解决方案,我不知道。(有一些非常漂亮的运行时字节码注入/操作工具可用,所以…) 但是,如果有足够的权限(以及信任级别!——这是一个很大的权限),用户可以动态编译和/或通过网络发送各种自我评估表达式(这与发送字节码本身不同,尽管理论上可以在提取字节码或等效代码的情况下完成) 上面的方法不是发送一个操作,它需要提取字节码进行序列化(包括捕获上下文,如果有的话),而是类似这样的操作,您可以进行有趣的讨论并最终找到它
另一方面,LINQ“了解”使用的字节码提取/反编译问题。请注意,它不发送字节码,而是使用此方法允许远程执行表达式树(常见的是SQL查询)。因此,您也认为我想做的事情不可能以我演示的方式完成,或者您不知道如何以这种方式完成。编译成DLL或者类似的东西对我来说不是一个选择,就像我说的。Action或Func不是对象,它是对函数的引用。把行动想象成功能。您能将函数发送到服务器执行吗?不,你不能。至少不是以你们认为你们可以的方式。所以你们基本上认为一个函数不是一个“真实”的对象?所有的东西都应该是C#中的对象吗!?所有事物都可以表示为对象(请参见您的操作)。但一般对象只能做很少的事情(基本上什么也做不到)。在您的情况下,您需要您的对象实现iSerialise(或类似的东西),以便将其转换为文本友好的形式,通过网络发送,然后重新构建为对象。函数没有这样的能力。主要是因为它们是可执行文件不可分割的一部分,不容易从中提取。所以你也认为我想做的事情不可能以我展示的方式完成,或者你不知道如何以这种方式完成。编译成DLL或者类似的东西对我来说不是一个选择,就像我说的。Action或Func不是对象,它是对函数的引用。把行动想象成功能。您能将函数发送到服务器执行吗?不,你不能。至少不是以你认为你可以的方式,所以