
# C#函数开发概述
FunctionGraph目前支持以下C#运行环境。
- C#(.NET Core 2.1)
- C#(.NET Core 3.1)
- C#(.NET Core 6.0)
- C#(.NET Core 8.0)（仅支持"中东-利雅得"、"土耳其-伊斯坦布尔"区域）
#### C#函数接口定义
C#函数接口定义：*作用域* *返回参数* *函数名（* *函数参数，Context* *参数）*
- 作用域：提供给FunctionGraph调用的用户函数必须定义为public。
- 返回参数：用户定义，FunctionGraph负责转换为字符串，作为HTTP Response返回。
- 函数名：用户自定义函数名称，需要和函数执行入口处用户自定义的入口函数名称一致。
- 上下文环境（context）：Runtime提供的函数执行上下文，相关属性定义在对象说明中。 HC.Serverless.Function.Common --部署在FunctionGraph服务中的项目工程需要引入该库，其中包含IFunctionContext对象，详情见context类说明。
  创建csharp函数时，需要定义某个类中的方法作为函数执行入口，该方法可以通过定义IFunctionContext类型的参数来访问当前执行函数的信息。例如：
  ```
  public Stream handlerName(Stream input,IFunctionContext context)
  {
         // TODO
  }
  ```
  
C#函数的函数执行入口参数格式为：**\[程序集名\]::\[命名空间\].\[类名\]::\[执行函数名\]**，例如CsharpDemo::CsharpDemo.Program::MyFunc，可通过FunctionGraph控制台进入函数详情页的常规设置中进行配置或修改。
#### 函数Handler定义
ASSEMBLY::NAMESPACE.CLASSNAME::METHODNAME
- .ASSEMBLY为应用程序的.NET程序集文件的名称，假设文件夹名称为HelloCsharp。
- NAMESPACE、CLASSNAME即入口执行函数所在的namespace和class名称。
- METHODNAME即入口执行函数名称。例如： 创建函数时Handler：HelloCsharp::Example.Hello::Handler。
  
 
#### SDK接口
- Context接口 Context类中提供了许多属性供用户使用，如[表1]所示。
   表1Context对象说明 
  | **属性名**                                            | **属性说明**                                                                                                                                                       |
  |:---|:---|
  | String RequestId                                   | 请求ID。                                                                                                                                                          |
  | String ProjectId                                   | Project Id。                                                                                                                                                    |
  | String PackageName                                 | 函数所在分组名称。                                                                                                                                                      |
  | String FunctionName                                | 函数名称。                                                                                                                                                          |
  | String FunctionVersion                             | 函数版本。                                                                                                                                                          |
  | Int MemoryLimitInMb                                | 分配的内存。                                                                                                                                                         |
  | Int CpuNumber                                      | 获取函数占用的CPU资源。                                                                                                                                                  |
  | String Accesskey                                   | 获取用户委托的AccessKey（有效期24小时），使用该方法需要为函数配置委托。 **当前函数工作流已停止维护Runtime SDK 中String AccessKey接口，您将无法使用String AccessKey获取临时AK。** |
  | String Secretkey                                   | 获取用户委托的SecretKey（有效期24小时），使用该方法需要为函数配置委托。 **当前函数工作流已停止维护Runtime SDK 中String SecretKey接口，您将无法使用String SecretKey获取临时SK。** |
  | String SecurityAccessKey                           | 获取用户委托的SecurityAccessKey（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                                  |
  | String SecuritySecretKey                           | 获取用户委托的SecuritySecretKey（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                                  |
  | String SecurityToken                               | 获取用户委托的SecurityToken（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                                      |
  | String Token                                       | 获取用户委托的Token（有效期24小时），使用该方法需要为函数配置委托。                                                                                                                          |
  | Int RemainingTimeInMilliSeconds                    | 函数剩余运行时间。                                                                                                                                                      |
  | String GetUserData(string key,string defvalue=" ") | 通过key获取用户通过环境变量传入的值。                                                                                                                                           |
     
  
- 日志接口 FunctionGraph中C# SDK中接口日志说明如所示。
  表2日志接口说明 
  | **方法名**                                  | **方法说明**                                                                                                                                                                                                                                             |
  |:---|:---|
  | Log(string message)                      | 利用context创建logger对象： var logger = context.Logger; logger.Log("hello CSharp runtime test(v1.0.2)");                                                                      |
  | Logf(string format, args ...interface{}) | 利用context创建logger对象： var logger = context.Logger; var version = "v1.0.2" logger.Logf("hello CSharp runtime test({0})", version); |
     
  
 
