
# 使用.NET Core CLI开发C#函数
C#新增json序列化和反序列化接口，并提供HC.Serverless.Function.Common.JsonSerializer.dll 。
提供的接口如下：
**T Deserialize\<T\>(Stream ins)**：反序列化值传递到Function处理程序的对象中。
**Stream Serialize\<T\>(T value)**：序列化值传递到返回的响应负载中。
本文以.NET Core 6.0创建"test"工程为例，其他运行时版本方法类似。执行环境已装有.NET SDK。
#### 新建项目
1. 创建目录"/tmp/csharp/projects /tmp/csharp/release" ，执行命令如下：
   ```
   mkdir -p  /tmp/csharp/projects;mkdir -p  /tmp/csharp/release
   ```
   
2. 进入"/tmp/csharp/projects/"目录，执行命令如下：
   ```
   cd /tmp/csharp/projects/
   ```
   
3. 新建工程文件 "test.csproj"，文件内容如下：
   ```
   <Project Sdk="Microsoft.NET.Sdk">
     <PropertyGroup>
       <TargetFramework>net6.0</TargetFramework>
       <RootNamespace>test</RootNamespace>
       <AssemblyName>test</AssemblyName>
     </PropertyGroup>
     <ItemGroup>
       <Reference Include="HC.Serverless.Function.Common">
         <HintPath>HC.Serverless.Function.Common.dll</HintPath>
       </Reference>
       <Reference Include="HC.Serverless.Function.Common.JsonSerializer">
         <HintPath> HC.Serverless.Function.Common.JsonSerializer.dll</HintPath>
       </Reference>
     </ItemGroup>
   </Project>
   ```
   
 
#### 生成代码库
1. 下载[dll文件](https://functionstage-community.obs.cn-north-1.myhuaweicloud.com/sdk/csharp/dll.zip)。
   将HC.Serverless.Function.Common.dll、HC.Serverless.Function.Common.JsonSerializer.dll、Newtonsoft.Json.dll文件上传至目录"/tmp/csharp/projects/"。
   
2. 在"/tmp/csharp/projects/"路径下，新建"Class1.cs"文件，代码内容如下：
   ```
   using HC.Serverless.Function.Common;
   using System;
   using System.IO;
   namespace test
   {
       public class Class1
       {
           public Stream ContextHandlerSerializer(Stream input, IFunctionContext context)
           {
               var logger = context.Logger;
               logger.Logf("CSharp runtime test(v1.0.2)");
               JsonSerializer test = new JsonSerializer();
               TestJson Testjson = test.Deserialize<TestJson>(input);
               if (Testjson != null)
               {
                   logger.Logf("json Deserialize KetTest={0}", Testjson.KetTest);
               }
               else
               {
                   return null;
               }
             return test.Serialize<TestJson>(Testjson);
           }
           public class TestJson
           {
               public string KetTest { get; set; }//定义序列化的类中的属性为KetTest
           }
       }
   }
   ```
   
3. 执行以下命令，生成代码库:
   ```
   dotnet build /tmp/csharp/projects/test.csproj -c Release -o /tmp/csharp/release
   ```
   ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
   dotnet的路径：/home/tools/dotnetcore-sdk/dotnet-sdk-2.1.302-linux-x64/dotnet。
   
4. 执行以下命令，进入"/tmp/csharp/release"路径。
   ```
   cd /tmp/csharp/release
   ```
   
5. 在路径"/tmp/csharp/release"下查看编译生成的dll文件，如下所示：
   ```
   -rw-r--r-- 1 root root 468480 Jan 21 16:40 Newtonsoft.Json.dll
   -rw-r--r-- 1 root root   5120 Jan 21 16:40 HC.Serverless.Function.Common.JsonSerializer.dll
   -rw-r--r-- 1 root root   5120 Jan 21 16:40 HC.Serverless.Function.Common.dll
   -rw-r--r-- 1 root root    232 Jan 21 17:10 test.pdb
   -rw-r--r-- 1 root root   3584 Jan 21 17:10 test.dll
   -rw-r--r-- 1 root root   1659 Jan 21 17:10 test.deps.json
   ```
   
6. 在"/tmp/csharp/release"路径下，新建文件"test.runtimeconfig.json"文件，文件内容如下：
   ```
   {
       "runtimeOptions": {
           "framework": {
               "name": "Microsoft.NETCore.App",
               "version": "6.0.0"
           }
       }
   }
   ```
   
7. 在"/tmp/csharp/release"路径下，执行如下命令，打包test.zip代码库压缩包。
   ```
   zip -r test.zip ./*
   ```
   
 
#### 测试示例
1. 在FunctionGraph控制台新建一个C#（.NET 6.0）空白事件函数，上传打包好的"test.zip"压缩包，如[图1]所示。
   图1上传代码包   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000001257384533.png "点击放大") 
2. 配置一个测试事件。如[图2]所示。其中的key必须设置为"KetTest"，value可以自定义。（**测试串必须为json格式。** ）
   图2配置测试事件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000001212904624.png "点击放大")
   ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
   KetTest：定义序列化的类中的属性为KetTest。
   
3. 单击"测试"，查看测试执行结果。
 
