
# 使用IDE开发C#事件函数
本章节介绍使用IDE工具开发C#事件函数的流程。关于C#函数接口定义、Initializer入口介绍以及SDK接口说明请参考[C#函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0505.html)。
#### 约束与限制
通过APIG服务调用函数服务时，isBase64Encoded的值默认为true，表示APIG传递给FunctionGraph的请求体body已经进行Base64编码，需要先对body内容Base64解码后再处理。
函数必须按以下结构返回字符串。
```
{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": {"headerName":"headerValue",...},
    "body": "..."
}
```
#### 查看dotnet版本信息
输入以下命令查看已安装的.NET版本信息。
```
dotnet --info
```
图1查看dotnet版本信息   
![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375951414.png "点击放大")
#### 步骤一：创建工程
1. 打开IDE，如[图2]所示创建C#编译工程，框架选择"net6.0"。
   图2创建工程   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002409211949.png "点击放大") 
2. 工程新建完成后，目录结构如所示。
   图3工程目录结构   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002409212073.png "点击放大") 
3. 下载FunctionGraph函数的[dll文件](https://functionstage-community.obs.cn-north-1.myhuaweicloud.com/sdk/csharp/dll.zip)，如[图4]所示将dll文件解压到该目录。
   图4dll文件解压到目录   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375532872.png "点击放大") 
4. 编辑项目中的"ConsoleApp1.csproj"文件，使该项目能够引用下载的dll文件，文件内容新增如下：
   ```
   <ItemGroup>
       <Reference Include="HC.Serverless.Function.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
           <HintPath>../HC.Serverless.Function.Common.dll</HintPath>
       </Reference>
   </ItemGroup>
   ```
   编辑完成后cspoj文件内容如[图5]所示。
   图5csproj文件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002409172841.png "点击放大") 
5. 编辑项目中的"Program.cs"文件，使用如下代码直接替换文件中原有的代码：
   ```
   using HC.Serverless.Function.Common;
   using System;
   using System.IO;
   using System.Text;
   namespace src
   {
       class Program
       {
           static void Main(string[] args)
           {
               Console.WriteLine("Hello World!");
           }
           public Stream myFunc(Stream input,IFunctionContext context)
           {
               string payload = "";
               if (input != null && input.Length > 0)
               {
                   byte[] buffer = new byte[input.Length];
                   input.Read(buffer, 0, (int)(input.Length));
                   payload = Encoding.UTF8.GetString(buffer);
               }
               var ms = new MemoryStream();
               using (var sw = new StreamWriter(ms))
               {
                   sw.WriteLine("CSharp runtime test(v1.0.2)");
                   sw.WriteLine("=====================================");
                   sw.WriteLine("Request Id:       {0}", context.RequestId);
                   sw.WriteLine("Function Name:    {0}", context.FunctionName);
                   sw.WriteLine("Function Version: {0}", context.FunctionVersion);
                   sw.WriteLine("Project:          {0}", context.ProjectId);
                   sw.WriteLine("Package:          {0}", context.PackageName);
                   sw.WriteLine("Security Access Key:       {0}", context.SecurityAccessKey);
                   sw.WriteLine("Security Secret Key:       {0}", context.SecuritySecretKey);
                   sw.WriteLine("Security Token:            {0}", context.SecurityToken);
                   sw.WriteLine("Token:            {0}", context.Token);
                   sw.WriteLine("User data(ud-a):  {0}", context.GetUserData("ud-a"));
                   sw.WriteLine("User data(ud-notexist): {0}", context.GetUserData("ud-notexist", ""));
                   sw.WriteLine("User data(ud-notexist-default): {0}", context.GetUserData("ud-notexist", "default value"));
                   sw.WriteLine("=====================================");
                   var logger = context.Logger;
                   logger.Logf("Hello CSharp runtime test(v1.0.2)");
                   sw.WriteLine(payload);
               }
               return new MemoryStream(ms.ToArray());
           }
       }
   }
   ```
   
6. 如[图6]所示，使用IDE的"编译"按钮编译C#工程。
   图6编译C#按钮   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002456913925.png "点击放大") 
7. 如[图7]所示将"ConsoleApp1\\bin\\Debug\\net6.0"路径下编译好的所有文件打包为zip格式文件。**请注意不要将整个文件夹进行打包，需确保压缩包解压后直接出现文件。**
   图7打包编译文件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375698214.png "点击放大") 
 
#### 步骤二：测试函数
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，右上角单击"创建函数"。
2. 如[图8]所示，创建一个空白的C#事件函数，单击"立即创建"进入函数详情页。
   图8创建函数   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002375545722.png "点击放大")
   
   
3. 上传[7]打包的zip文件，如[图9]所示，代码包上传后将在FunctionGraph控制台自动部署。
   图9上传代码   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002409305729.png "点击放大") 
4. 如[图10]所示，选择"设置 \> 常规设置"，将函数执行入口配置为"ConsoleApp1::src.Program::myFunc"，单击"保存"。
   ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
   样例工程包中的C#工程编译后生成的文件为ConsoleApp1.dll，因此函数执行入口中的程序集名为ConsoleApp1。
   图10配置函数执行入口   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002409226317.png "点击放大") 
5. 回到"代码"页签，单击"测试"配置一个空白测试事件。
6. 如[图11]所示，选择已创建的空白测试事件，单击"测试"，查看函数执行结果。
   图11测试函数   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002409226949.png "点击放大") 
 
#### 执行结果
执行结果由3部分组成：函数返回、执行摘要和日志。
表1执行结果说明 
| 参数项  | 执行成功                          | 执行失败                                                                                                                                                                                               |
|:---|:---|:---|
| 函数返回 | 返回函数中定义的返回信息。                 | 返回包含错误信息和错误类型的JSON文件。格式如下： ``` { "errorMessage": "", "errorType": "" } ``` errorMessage：Runtime返回的错误信息 errorType：错误类型 |
| 执行摘要 | 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 | 显示请求ID、配置内存、执行时长、实际使用内存和收费时长。                                                                                                                                                                      |
| 日志   | 打印函数日志，最多显示4KB的日志。            | 打印报错信息，最多显示4KB的日志。                                                                                                                                                                                 |
   
