主要内容

本页采用了机器翻译。点击此处可查看英文原文。

创建 Windows Communications Foundation 组件

R2026b

下面的示例展示如何使用类型安全接口实现 Windows® Communications Foundation (WCF) 组件并将其集成到客户端-服务器 .NET 应用程序中。

有关类型安全接口的其他示例和数据转换规则,请参阅实现类型安全接口并集成到 .NET 应用程序中。

有关 WCF 的最新信息,请参阅 Microsoft® 文档中的什么是 Windows Communication Foundation。

编写并测试您的 MATLAB 代码

创建 MATLAB® 程序,然后在实现类型安全接口之前测试代码。MATLAB 程序中的函数必须与本机 .NET 接口中的声明相匹配。

对于此示例,将以下代码保存为 addOne.m。

function y = addOne(x)
% Input must be either a scalar or a matrix of single or multiple dimensions

    if ~isnumeric(x)
        error('Input must be numeric. Input was %s.', class(x));
    end
    y = x + 1;

end

在 MATLAB 命令提示符下,输入 addOne([1,2,3])。

输出为:

     2     3     4

实现 WCF 接口

编写并测试 MATLAB 代码后,使用 C# 或 Visual Basic® 开发一个通过 API 支持本机类型的接口。

  1. 打开 Microsoft Visual Studio® 并创建一个名为 IAddOne 的新 Class Library (.NET Framework) 工程。

  2. 在 Visual Studio 的解决方案资源管理器窗口中,将 Class1.cs 文件重命名为 IAddOne.cs。在此文件中,编写访问组件的 WCF 接口的源代码。

    在此示例中,IAddOne 接口用 C# 编写,并指定了 addOne 的六个重载:

    using System;
    using System.ServiceModel;
    
    [ServiceContract]
    public interface IAddOne
    {
        [OperationContract(Name = "addOne_1")]
        int addOne(int x);
    
        [OperationContract(Name = "addOne_2")]
        void addOne(ref int y, int x);
    
        [OperationContract(Name = "addOne_3")]
        void addOne(int x, ref int y);
    
        [OperationContract(Name = "addOne_4")]
        System.Double addOne(System.Double x);
    
        [OperationContract(Name = "addOne_5")]
        System.Double[] addOne(System.Double[] x);
    
        [OperationContract(Name = "addOne_6")]
        System.Double[][] addOne(System.Double[][] x);
    }
    

    请注意,在 addOne 的 WCF 实现中,您使用 OperationContract 属性来修饰该方法。您为每个方法赋予一个唯一的操作名称,该名称是通过 Name 的 OperationContract 属性指定的。

    注意

    使用 WCF 时,重载函数必须具有唯一的名称。

    接口中的每个方法必须与部署的 MATLAB 函数完全匹配。所有方法都有一个输入和一个输出(以匹配 MATLAB addOne 函数),尽管这些参数的类型和位置各不相同。

  3. 转到 Build > Configuration Manager 并将平台从 Any CPU 更改为 x64。

  4. 使用 Microsoft Visual Studio 构建工程。在构建文件夹中生成文件 IAddOne.dll。

    注意

    此示例假设您的程序集仅包含 IAddOne。实际上,IAddOne 更有可能已经是已编译程序集的一部分。甚至在编写 MATLAB 函数之前,汇编可能就已经完成了。

使用 compiler.build.dotNETAssembly 创建 .NET 程序集

要使用 compiler.build.dotNETAssembly 函数在组件构建中生成类型安全的 API,请完成以下步骤:

  1. 使用 compiler.build.dotNETAssembly 构建 .NET 程序集。使用名称-值参量指定程序集名称和类名。

    compiler.build.dotNETAssembly('addOne.m', ...
        'AssemblyName','AddOneComp', ...
        'ClassName','Mechanism');
    
  2. 导航到生成的 AddOneCompdotNETAssembly 目录。

  3. 使用 MATLAB 中的 ntswrap 命令生成类型安全的 API:

    ntswrap('-c','AddOneComp.Mechanism', ...
            '-a','IAddOne.dll', ...
            '-i','IAddOne');

    并非所有参量都是互相兼容的。有关所有命令选项的详细信息,请参阅 ntswrap。

    提示

    如果 IAddOne.dll 程序集不在当前文件夹中,请指定完整路径。

    此命令生成程序集 MechanismIAddOne.dll,其中包含命名空间 Mechanism 中 MATLAB Compiler SDK™ 类 AddOneCompNative 的类型安全 API。

使用 WCF 接口开发服务器程序

开发一个服务器程序,通过 WCFServiceContract 提供对 WCF addOne 接口定义的 IAddOne 重载的访问。该程序引用了 App.config XML 配置文件。

WCF 服务器程序加载基于 WCF 的 addOne.Mechanism 组件,并通过类型安全的 mechanismIAddOne 接口使其可供 SOAP 客户端使用。

提示

当编写界面时,您将编写代码来处理锯齿状数组,而不是矩形数组。有关详细信息,请参阅锯齿状数组处理。

使用 Microsoft Visual Studio 编译服务器程序,步骤如下:

  1. 打开 Microsoft Visual Studio 并创建一个名为 AddOneApp 的 C# Console App (.NET Framework)。

  2. 将以下源代码复制到工程中生成的 Program.cs 中:

    using System;
    using System.Text;
    using System.ServiceModel;
    
    
    namespace AdditionServer
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    using (ServiceHost host =  new ServiceHost(typeof(MechanismIAddOne)))
                    {
                        host.Open();
                        Console.WriteLine("Addition Server is up running......");
                        Console.WriteLine("Press any key to close the service.");
                        Console.ReadLine();
                        Console.WriteLine("Closing service...");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
    
  3. 将以下配置文件 App.config 添加到您的工程。您可能需要修改列出的 .NET Framework 版本。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
      </startup>
      <system.web>
        <compilation debug="true" />
      </system.web>
      <system.serviceModel>
        <services>
          <service behaviorConfiguration=
           "Addition.ServiceBehavior" name="MechanismIAddOne">
            <endpoint
              address=""
              binding="wsHttpBinding"
              contract="IAddOne"
              name="HttpBinding" />
            <endpoint
            address=""
            binding="netTcpBinding"
            contract="IAddOne"
            name="netTcpBinding" />
            <endpoint
              address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange"
              name="MexHtppBinding"/>
            <endpoint
            address="mex"
            binding="mexTcpBinding"
            contract="IMetadataExchange"
            name="MexTCPBinding"/>
            <host>
              <baseAddresses>
                <add baseAddress=
                    "http://localhost:8001/AdditionServer/" />
                <add baseAddress=
                    "net.tcp://localhost:8002/AdditionServer/" />
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="Addition.ServiceBehavior">
              <serviceMetadata httpGetEnabled="True" httpGetUrl=
                         "http://localhost:8001/AdditionServer/mex" />
              <!-- To receive exception details in faults for debugging purposes, 
              set the value below to true.  Set to false before
              deployment to avoid disclosing exception 
              information -->
              <serviceDebug includeExceptionDetailInFaults="True" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
  4. 在工程中添加对以下文件的引用:

    此引用:定义:
    IAddOne.dll.NET 本机类型接口 IAddOne
    MechanismIAddOne.dll生成的类型安全 API
    AddOneCompNative.dll生成的 .NET 程序集

    注意

    与其他 .NET 部署场景不同,您不需要在服务器程序源代码中引用 MWArray.dll。MWArray 数据类型隐藏在 MechanismIAddOne 中类型安全的 API 后面。

  5. 添加对 System.ServiceModel 的引用,该引用在 Assemblies 下列出。

  6. 转到 Build > Configuration Manager 并将平台从 Any CPU 更改为 x64。

  7. 使用 Microsoft Visual Studio 编译并运行服务器程序。

    该程序显示以下输出:

    Addition Server is up running......
    Press any key to close the service.
    

    按下某个键会产生以下结果。

    Closing service....

为客户端生成代理代码

通过运行自动代理生成工具 svcutil.exe 配置您的客户端与服务器进行通信。大多数版本的 Microsoft Visual Studio 可以从服务器元数据自动生成客户端代理代码。

小心

在使用此步骤生成客户端代理代码之前,服务器必须可用且正在运行。否则,客户端将找不到服务器。

  1. 在 Microsoft Visual Studio 中创建客户端工程。

  2. 使用这两种方法之一添加引用。

    方法 1方法 2
    1. 在解决方案资源管理器窗格中,右键点击 References。

    2. 选择 Add Service Reference。出现添加服务引用对话框。

    3. 在 Address 字段中输入:http://localhost:8001/Addition/

      注意

      请确保在 / 后面包含 Addition。

    4. 在 Namespace 字段中,输入 AdditionProxy。

    5. 点击确定。

    1. 从客户端应用程序目录输入以下命令来生成 AdditionProxy.cs,其中包含客户端代理代码。此命令还生成配置文件 App.config。

      svcutil.exe /t:code http://localhost:8001/Addition//out:AdditionProxy.cs /config:App.config

      注意

      在一行中输入上述命令,不要间断。

    2. 将 AdditionProxy.cs 和 App.config 添加到您的客户端工程

注意

运行自托管应用程序时,您可能会遇到端口预留问题。根据需要,使用工具 netsh 修改端口配置。

使用 WCF 接口开发客户端程序

在启动时,客户端程序连接到 AdditionService WCF 服务提供的 Addition。WCF 客户端不直接调用类型安全机制 IAddOne 接口的方法,而是使用 OperationContract 的 IAddOne 属性中定义的方法名称。

通过执行以下操作,使用 Microsoft Visual Studio 编译客户端程序:

  1. 打开 Microsoft Visual Studio 并创建一个名为 AdditionClient 的 C# Console App (.NET Framework)。

  2. 将以下源代码复制到工程中生成的 Program.cs 中:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.ServiceModel;
    
    
    namespace AdditionClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    // Connect to Addition Service
                    Console.WriteLine("\nConntecting to Addition Service through Http connection...");
    
                    AdditionClient.AdditionProxy.AddOneClient Addition = new AdditionClient.AdditionProxy.AddOneClient("HttpBinding");
    
                    Console.WriteLine("\nConntected to Addition Service...\n");
    
                    // Output as return value
                    int one = 10;
                    int two = Addition.addOne_1(one);
                    Console.WriteLine("addOne({0}) = {1}",
                                                    one, two);
    
                    // Output: first parameter
                    int i16 = 16;
                    int o17 = 0;
                    Addition.addOne_2(ref o17, i16);
                    Console.WriteLine("addOne({0}) = {1}", i16, o17);
    
                    // Output: second parameter
                    int three = 0;
                    Addition.addOne_3(two, ref three);
                    Console.WriteLine("addOne({0}) = {1}",
                                                  two, three);
    
                    // Scalar doubles
                    System.Double i495 = 495.0;
                    System.Double third =
                                     Addition.addOne_4(i495);
                    Console.WriteLine("addOne({0}) = {1}",
                                                i495, third);
    
                    // Vector addition
                    System.Double[] i = { 30, 60, 88 };
                    System.Double[] o = Addition.addOne_5(i);
                    Console.WriteLine(
                         "addOne([{0} {1} {2}]) = [{3} {4} {5}]",
                             i[0], i[1], i[2], o[0], o[1], o[2]);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
    
                Console.WriteLine("\nPress any key to close the client application.");
                Console.ReadLine();
                Console.WriteLine("Closing client...");
            }
        }
    }
  3. 如果您尚未引用 System.ServiceModel,请将其添加到您的 Visual Studio 工程中。

  4. 转到 Build > Configuration Manager 并将平台从 Any CPU 更改为 x64。

  5. 使用 Microsoft Visual Studio 编译 WCF 客户端程序。

  6. 以管理员权限从命令行运行该程序。

    该程序显示以下输出:

    Conntecting to Addition Service through Http connection...
    Conntected to Addition Service...
    addOne(1) = 2
    addOne(16) = 17
    addOne(2) = 3
    addOne(495) = 496
    addOne([30 60 88]) = [31 61 89]
    addOne([0 2; 3 1]) = [1 3; 4 2]
    Press any key to close the client application.
    

    按下一个键会导致以下结果:

    Closing client....

提示

  • 如果您想使用 WCF,最简单的方法是通过类型安全的 API。

  • WCF 和 .NET 远程处理在同一个部署工程或组件中不兼容。

  • 此示例要求客户端和服务器都使用大于 WCF 默认值的消息大小。有关更改默认消息大小的信息,请参阅有关 maxreceivedmessagesize 属性的 MSDN 文章。

另请参阅

| | |

主题