C# 远程执行操作<&燃气轮机;或Func<&燃气轮机;物体

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

我想使用WCF将操作或Func对象从C#client传输(并执行)到C#server应用程序

这是我的密码:

[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展示了这样一个解决方案是如何可能的


然而,这是一项相当可观的工作。

我会想到两种解决方案,它们的性质都非常疯狂。主要是因为您请求将代码发送到服务器以执行,这与人们每天都做的事情无关(我认为没有人做过类似的事情)

  • DLL解决方案: 将代码编译成单独的DLL。将此DLL作为流发送到服务器。从该DLL使用服务器上的反射加载具有接口的某些类。然后可以在创建的类中运行代码

  • 代码解决方案: 基本上与第一个相同,但不是发送预编译的DLL,而是将代码作为字符串发送,然后使用可编程C#编译器编译并运行该代码


  • 但您仍然无法从任何函数中提取代码。请记住,操作只不过是程序集中硬编码函数的委托(引用)。

    我会想到两种解决方案,它们的本质都非常疯狂。主要是因为您请求将代码发送到服务器以执行,这与人们每天都做的事情无关(我认为没有人做过类似的事情)

  • DLL解决方案: 将代码编译成单独的DLL。将此DLL作为流发送到服务器。从该DLL使用服务器上的反射加载具有接口的某些类。然后可以在创建的类中运行代码

  • 代码解决方案: 基本上与第一个相同,但不是发送预编译的DLL,而是将代码作为字符串发送,然后使用可编程C#编译器编译并运行该代码


  • 但您仍然无法从任何函数中提取代码。请记住,操作只不过是程序集中硬编码函数的委托(引用)。

    可能存在现有的解决方案,我不知道。(有一些非常漂亮的运行时字节码注入/操作工具可用,所以…)

    但是,如果有足够的权限(以及信任级别!——这是一个很大的权限),用户可以动态编译和/或通过网络发送各种自我评估表达式(这与发送字节码本身不同,尽管理论上可以在提取字节码或等效代码的情况下完成)

    上面的方法不是发送一个操作,它需要提取字节码进行序列化(包括捕获上下文,如果有的话),而是类似这样的操作,您可以进行有趣的讨论并最终找到它


    另一方面,LINQ“了解”使用的字节码提取/反编译问题。请注意,它不发送字节码,而是使用此方法允许远程执行表达式树(常见的是SQL查询)。

    可能存在现有的解决方案,我不知道。(有一些非常漂亮的运行时字节码注入/操作工具可用,所以…)

    但是,如果有足够的权限(以及信任级别!——这是一个很大的权限),用户可以动态编译和/或通过网络发送各种自我评估表达式(这与发送字节码本身不同,尽管理论上可以在提取字节码或等效代码的情况下完成)

    上面的方法不是发送一个操作,它需要提取字节码进行序列化(包括捕获上下文,如果有的话),而是类似这样的操作,您可以进行有趣的讨论并最终找到它


    另一方面,LINQ“了解”使用的字节码提取/反编译问题。请注意,它不发送字节码,而是使用此方法允许远程执行表达式树(常见的是SQL查询)。

    因此,您也认为我想做的事情不可能以我演示的方式完成,或者您不知道如何以这种方式完成。编译成DLL或者类似的东西对我来说不是一个选择,就像我说的。Action或Func不是对象,它是对函数的引用。把行动想象成功能。您能将函数发送到服务器执行吗?不,你不能。至少不是以你们认为你们可以的方式。所以你们基本上认为一个函数不是一个“真实”的对象?所有的东西都应该是C#中的对象吗!?所有事物都可以表示为对象(请参见您的操作)。但一般对象只能做很少的事情(基本上什么也做不到)。在您的情况下,您需要您的对象实现iSerialise(或类似的东西),以便将其转换为文本友好的形式,通过网络发送,然后重新构建为对象。函数没有这样的能力。主要是因为它们是可执行文件不可分割的一部分,不容易从中提取。所以你也认为我想做的事情不可能以我展示的方式完成,或者你不知道如何以这种方式完成。编译成DLL或者类似的东西对我来说不是一个选择,就像我说的。Action或Func不是对象,它是对函数的引用。把行动想象成功能。您能将函数发送到服务器执行吗?不,你不能。至少不是以你认为你可以的方式,所以