본문 바로가기

Programming/Azure

Include Unmanaged code(C/C++) in Azure functions

Objective

C/C++로 작성한 Dll을 참조한 Azure Functions을 구축

 

Prerequisite

Visual Studio 2017 version 15.5 or later



Azure Development WorkLoad가 설치되어야 합니다.

Azure Subscription이 필요합니다.

Azure Storage account가 필요합니다.

 

Tools > Extensions and Update > Azure Functions and Web Jobs Tools를 설치하여야 합니다.




 

Create Azure Functions project





Project > New Project에서 Azure Functions Template을 선택하고 Name을 작성하고, OK 버튼을 클릭합니다.

 



좌상단의 Azure Functions v2를 선택합니다. (v1.net Framework, v2.net core)

Http 요청에 따라 실행하는 sample을 만들기 위해서 좌측의 icon list에서 Http trigger를 선택합니다.

Http trigger유형은 Storage account가 필요하지 않습니다.(그대로 둡니다.)

테스트를 위해서 접속권한은 anonymous로 만듭니다.

 

Unmanaged Code Dllproject에 참조합니다.



Code는 본문 Output > Unmanaged Code부분 참조

 

Function 코드를 수정하여 Unmanaged Code를 참조합니다.

Code는 본문 Output > Function Code부분 참조

 

Deploy

배포하기



Azure Functions project를 우클릭하여 Publish 메뉴 선택

신규로 생성하거나, 기존의 것을 선택하여 배포할 위치를 선택한 뒤 Publish 버튼 클릭.

Visual StudioOutput window를 통해서 배포 여부 확인 및 실증.

 

Upload dll

KUDU를 활용하여, 해당 folderdll에 파일을 수동으로 업로드가 가능함.



KUDU에 접속하여 Debug console > CMD 메뉴로 이동



Site/wwwroot/bin 폴더로 이동

파일 목록 영역에 Drag&Drop으로 파일을 업로드

 

Output

Unmanaged Code

#include <stdio.h>

 

extern "C"

{

    __declspec(dllexport) double FetchPie() {

        return 3.14L;

    }

}

 

 

Function Code

public static class Function1

{

    [DllImport("D:\\home\\site\\wwwroot\\bin\\TestLib.dll")]

    public static extern double FetchPie();

 

    [FunctionName("Function1")]

    public static async Task<IActionResult> Run(

        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,

        ILogger log)

    {

        log.LogInformation("C# HTTP trigger function processed a request.");

 

        string name = req.Query["name"];

 

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

        dynamic data = JsonConvert.DeserializeObject(requestBody);

        name = name ?? data?.name;

name += FetchPie().ToString();  // Unmanaged Code Call

 

        return name != null

            ? (ActionResult)new OkObjectResult($"Hello, {name}")

            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");

    }

}

 

References

Develop Azure Functions using Visual Studio

https://docs.microsoft.com/en-us/azure/azure-functions/functions-develop-vs

How to add assembly references to an Azure Function App

https://blogs.msdn.microsoft.com/benjaminperkins/2017/04/13/how-to-add-assembly-references-to-an-azure-function-app/

how to create a DLL library in C and then use it with C#

https://www.codeproject.com/Articles/9826/How-to-create-a-DLL-library-in-C-and-then-use-it-w