.NET은 자바가상머신처럼 플랫폼에 종속되지 않고 동일한 코드를 사용해서 같은 결과를 얻을 수 있게 한다. 그런데 Visual Studio 자체가 Window 플랫폼을 위한 도구다 보니, 리눅스에 대한 빌드 및 배포에 관한 자료가 별로 없어서 글을 작성한다. 정말 애를 먹었다.
원초적으로는 The library 'libhostpolicy.so' required to execute the application was not found in ... 에러의 해결법이다.
또한 본 글은 윈도우에서 빌드 후 dll 파일을 우분투에서 실행시키는 법을 담고 있다.
먼저 윈도우에는 닷넷 프레임워크가 깔려있다는 전제(Visual Studio를 통해서) 하에 아래 글을 읽어주길 바란다.
1. 우분투에 .NET 깔기
msdn에서 친절하게 설명해주고 있으니 깔도록 하자. 나는 ubuntu 18.04(LTS)에 설치를 했다.
sdk로 설치를 하면 된다.
docs.microsoft.com/ko-kr/dotnet/core/install/linux-ubuntu
다 깔고 나면 dotnet --info
명령어를 통해서 잘 깔렸는지 볼 수 있다. 아래 사진에서는 현재 최신버전인 5.0이 설치된 것을 볼 수 있다.
2. 윈도우에서 리눅스용으로 빌드
윈도우 터미널을 열어서 해당 프로젝트의 디렉토리로 이동해주자. csproj 가 있는 폴더로 가주면 된다.
그리고 dotnet publish -r linux-x64
를 입력한다. publish 이후에는 /bin/Debug/net5.0(혹은 다른 버전)/linux-x64 에 publish 폴더가 생긴다. 이 폴더의 내용을 통째로 복사해서 우분투에 넣어준 뒤 ELF를 실행시키면 닷넷이 안깔려있어도 실행이 된다. 그러나 Hello World 출력하는 프로그램이 72mb나 먹는것은 말도 안되기 때문에 우리는 (프로젝트 이름.dll) 과 (프로젝트 이름.runtimeconfig.json) 파일만 우분투로 옮겨주면 된다.
3. 우분투에서 실행
현재까지 과정을 따라했다면 폴더에 다음과 같이 dll과 json 두개의 파일이 남아있을 것이다. 여기서 dotnet Ubuntu\_Dotnet.dll
로 실행을 하면 에러가 뜬다. 따라서 json의 수정이 필요하다.
해당 폴더의 json에 아래 내용을 덮어씌워주자.
{
"runtimeOptions": {
"tfm": "net5.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "5.0.0"
}
}
}
이후 dotnet 파일이름.dll
로 실행을 하면 된다.