如何:生成宿主应用程序

本主题介绍一项传统技术,保留该技术是为了向后兼容现有的应用程序,不建议对新的开发使用该技术。现在应该使用  Windows Communication Foundation (WCF) 来开发分布式应用程序。

如何:生成可远程处理的类型主题中定义的 RemotableType 类本身并无特别之处。若要让其他应用程序域中的对象能够远程创建此对象的实例,必须生成宿主或侦听器应用程序来执行下列操作:

  • 选择并注册信道。信道是代表您处理网络协议和序列化格式的对象。

  • 在 .NET 远程处理系统中注册类型,以使它能够使用您的信道侦听类型请求。

.NET Framework 包括三个默认信道:HttpChannel(默认使用 SOAP 格式)、TcpChannel(默认使用二进制格式)和 IpcChannel(默认使用二进制格式)。HttpChannel 无需开放端口即可穿过防火墙使用,它支持标准安全和身份验证协议。有关选择适合于您的方案的信道的更多信息,请参见信道

任何类型的应用程序域均可用于生成侦听器应用程序 - Windows 窗体应用程序、ASP.NET Web 应用程序、控制台应用程序、Windows 服务(又称为 Windows NT 服务)或任何其他托管应用程序域。由于每个应用程序域都进行了远程配置,因此它们必须处于运行状态才能侦听请求。

ecc85927.note(zh-cn,VS.100).gif注意:
与 COM 不同的是,远程处理不会为您启动宿主或服务器应用程序。这是 .NET 远程处理和 COM 远程激活之间的一个重要区别。

配置可通过编程方式进行,也可以使用应用程序或计算机配置文件完成。

远程处理系统使用此文件中的信息侦听远程请求,并将其路由到可远程处理的类型的实例。该文件指定服务器激活模式、要代表其进行侦听的类型名称和类型程序集、对象统一资源标识符 (URI) 或对象的外部名称(有关对象 URI 和远程处理的更多信息,请参见激活 URL)。

ecc85927.note(zh-cn,VS.100).gif注意:
虽然上述配置文件中只有很少的设置,但使用 .NET 远程处理出现的大多数问题都是由于其中的部分设置有误或与客户端应用程序的配置设置不匹配造成的。人们很容易键错名称、忘记某个端口或忽略某个特性。如果远程处理应用程序出现问题,请先检查配置设置。

使用配置文件有很多优点,例如可以更改远程处理配置而不用重新编译可执行文件。有关 .NET 远程处理基础结构配置的信息,请参见远程处理设置架构

ecc85927.note(zh-cn,VS.100).gif注意:
有关如何生成和运行此示例的完整说明,请参见如何:编译和运行基本远程处理应用程序

实现简单的使用配置文件的宿主应用程序域

  1. 执行完如何:生成可远程处理的类型中的步骤后,请在 remoting 下创建另一个目录,并将其命名为 host。接着为远程类创建一个配置文件。宿主应用程序必须能够加载远程类的配置,因此应将该配置文件与宿主应用程序的程序集保存在同一个目录中,否则将找不到该配置文件并引发异常。下面的代码演示一个配置文件,此文件指定远程对象为 Singleton,其实现是一个位于程序集 RemotableType 中的类 RemotableType。接下来,注册 HttpChannel 以侦听端口 8989。将此文件保存在 remoting\listener 目录中。文件名应遵从 应用程序名称.exe.config 模式。在本例中,它称为 listener.exe.config

    <configuration>
       <system.runtime.remoting>
          <application>
             <service>
                <wellknown 
                   mode="Singleton" 
                   type="RemotableType, RemotableType" 
                   objectUri="RemotableType.rem"
                />
             </service>
             <channels>
                <channel ref="http" port="8989"/>
             </channels>
          </application>
       </system.runtime.remoting>
    </configuration>
    
  2. 为所选语言创建一个新的源文件。在该源文件顶部导入 System.Runtime.Remoting 命名空间:

    Imports System
    Imports System.Runtime.Remoting
    
    using System;
    using System.Runtime.Remoting;
    
  3. 在 Main 方法中,加载配置远程类的配置文件,显示一条消息以让用户知道宿主正在运行,然后等待按键操作。将此文件保存在 remoting\listener 目录中。

    Public Class Listener
        Public Shared Sub Main()
            RemotingConfiguration.Configure("Listener.exe.config", False)
            Console.WriteLine("Listening for requests. Press enter to exit...")
            Console.ReadLine()
        End Sub
    End Class
    
    public class Listener
    {
        public static void Main()
        {
            RemotingConfiguration.Configure("Listener.exe.config", false);
            Console.WriteLine("Listening for requests. Press enter to exit...");
            Console.ReadLine();
        }
    
    }
    
  4. 如何:生成可远程处理的类型中生成的 RemotableType.dll 复制到 remoting\listener 目录中。宿主应用程序必须引用此程序集。通过键入以下命令,将此类编译为一个可执行文件:

    vbc /r:RemotableType.dll Listener.vb
    
    csc /noconfig /r:RemotableType.dll Listener.cs
    
  5. 现在,您已得到一个名为 Listener.exe 的程序集。接下来,请尝试运行此程序集,以确定配置是否成功。如果防火墙当前正阻止 8989 端口,则可能会显示一个安全对话框。如果是这样,请单击“取消禁止[Unblock]”按钮暂时对该端口开放防火墙。

  6. 有关如何使用可远程处理的类型的信息,请参见如何:生成客户端应用程序

示例

' Listener.vb
Public Class Listener
    Public Shared Sub Main()
        RemotingConfiguration.Configure("Listener.exe.config", False)
        Console.WriteLine("Listening for requests. Press enter to exit...")
        Console.ReadLine()
    End Sub
End Class
// Listener.cs
using System;
using System.Runtime.Remoting;

public class Listener
{
    public static void Main(string[] args)
    {
        RemotingConfiguration.Configure("Listener.exe.config", false);
        Console.WriteLine("Listening for requests. Press enter to exit...");
        Console.ReadLine();
    }
}

另请参见

任务

如何:生成宿主应用程序

参考

远程处理设置架构

概念

远程应用程序的配置
服务器激活

其他资源

生成基本的 .NET Framework 远程处理应用程序

生成日期:2010-02-13