
# 使用Visual Studio开发C#函数
新增json序列化和反序列化接口，并提供HC.Serverless.Function.Common.JsonSerializer.dll 。
提供的接口如下：
**T Deserialize\<T\>(Stream ins)**：反序列化值传递到Function处理程序的对象中。
**Stream Serialize\<T\>(T value)**：序列化值传递到返回的响应负载中。
本文以Visual Studio 2022新建一个.NET Core 6.0的"ClassLibrary"工程为例，其他运行时版本方法类似。
#### 步骤一：构建项目
1. 在Visual Studio中选择"创建新项目"，如[图1]所示选择"类库"，单击"下一步"，选择框架为".NET 6.0"创建项目。
   图1新建项目   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002409154325.png "点击放大")
   
   
2. 如[图2]所示，选择解决方案资源管理器中"ClassLibrary"工程，单击鼠标右键，单击"添加项目引用"。
   图2添加引用   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375676164.png)
   
   
3. 选择"浏览"，单击"浏览(B) "，选择下载的[dll文件](https://functionstage-community.obs.cn-north-1.myhuaweicloud.com/sdk/csharp/dll.zip)中的三个库进行引用，单击"确定"。
   dll文件中一共有三个库：HC.Serverless.Function.Common.dll、HC.Serverless.Function.Common.JsonSerializer.dll、Newtonsoft.Json.dll。
   
4. 引用成功后界面如[图3]所示。
   图3完成引用   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375678516.png)
   
   
 
#### 步骤二：打包代码
本例所用示例代码如下：
```
using HC.Serverless.Function.Common;
using System;
using System.IO;
namespace ClassLibrary2
{
    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);
            }
            return test.Serialize<TestJson>(Testjson);
        }
        public class TestJson
        {
            public string KetTest { get; set; }//定义序列化的类中的属性为KetTest
        }
    }
}
```
1. 如[图4]所示，单击菜单栏的"生成 \> 生成解决方案"，拷贝输出框中生成的dll文件的路径。
   图4生成文件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375684608.png "点击放大")
   
   
2. 如[图5]所示，在本地该路径的文件夹中查看生成的文件。
   图5文件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002409204989.png "点击放大") 
3. 在该文件夹中新建"ClassLibrary.runtimeconfig.json"文件并填入以下内容。完成后文件中共有7个文件。
   ```
   {
       "runtimeOptions": {
           "framework": {
               "name": "Microsoft.NETCore.App",
               "version": "6.0.0"
           }
       }
   }
   ```
   ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
   - \*.runtimeconfig.json文件的名称为程序集的名称。
   
   - 文件内容中的version为项目属性中的目标框架的版本号。
     
4. 将该文件夹中的文件打包为zip格式压缩包。**请注意不要将整个文件夹进行打包，需确保压缩包解压后直接出现7个文件。**
 
#### 步骤三：测试函数
1. 在华为云FunctionGraph控制台新建一个C#（.NET Core 6.0）空白事件函数，如[图6]所示上传[4]打包完成的zip代码包。
   图6上传代码包   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375686824.png "点击放大")
   
   
2. 如[图7]所示选择"设置 \> 常规设置"，将函数执行入口配置为"ClassLibrary2::ClassLibrary2.Class1::ContextHandlerSerializer"，单击"保存"。
   图7配置函数执行入口   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375687196.png "点击放大")
   
   
3. 回到"代码"页签，单击"测试"配置测试事件。如[图8]所示，将key修改为"KetTest"即可识别出对应的value。
   图8配置测试事件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375687752.png "点击放大")
   
   ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
   KetTest：定义序列化的类中的属性为KetTest.
   
4. 单击"测试"，查看测试执行结果。
   图9查看执行结果   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002377562322.png "点击放大")
   
   
 
