온라인으로 C# 코드를 실행할 수 있는 방법 조사 - slog(완료)

올해부터는 부지런히 슬로그 서비스를 만들어야 하므로 C# 개발자(또는 학생)가 슬로그 서비스를 통해 웹 브라우저에서 C# 코드를 실행할 수 있도록 하고 싶었습니다.

두가지 방식이 가능할텐데요,

  • 서버에서 C# 코드를 실행한 후 그 결과를 웹브라우저로 반환
  • 웹브라우저에서 Blazor Webassembly 환경으로 C# 코드를 바로 실행

그리고 코드 에디터도 필요할텐데요, 코드 에디터는 monaco-editor 을 이용할 수 있을 것 같습니다.

웹브라우저에서 C# 코드를 실행할 수 있는 환경을 만들어주는 Try .NET라는 것도 있는데 이분들이 소규모이고 .NET Interactive 개발에 집중하다 보니 지금은 개발이 진행되지 않고 있네요.

어쨌든 관련 정보들을 수집해서 데모 프로그램 만드는게 이번 슬로그의 목표입니다.

5개의 좋아요

LinkPad 를 온라인으로… 는 안 되겠죠?..

쿨럭… ;ㅂ;

3개의 좋아요

쿨럭…

2개의 좋아요

먼저 조사 전 개념적 접근을 해보려 합니다.

.NET은 C# 코드를 런타임에서 컴파일 해서 실행할 수 있습니다. .NET 6에서는 심지어 변경된 부분만 런타임에 반영 시킬수도 있습니다. Roslyn을 이용하면 됩니다.

Blazor Webassembly를 이용하면 .NET 인터프리터를 웹브라우저에서 실행할 수 있으므로 역시 동일한 방법으로 C# 코드를 실행할 수 있습니다. 아마 Try .NET이 이 방식을 이용할 것 같습니다.

그런데 이 방식은 AOT 대상에서는 사용할 수 가 없습니다. 웹브라우저에서 Roslyn 모듈을 사용할 수 있다 하더라도 생성되는 정보는 MSIL이고 MSIL을 실행하는 무언가가 있어야 하는데요, AOT를 쓰게 되면 이를 처리할 수가 없습니다.

(이것은 비단 MSIL → Webassembly 로 변환하는 Webassembly용 모듈이 아직은 없기 때문이겠지요)

2개의 좋아요

음… 전 말씀하신 부분이 잘 이해가 안 되는데요.

웹 상에서 어떤 인스턴스를 수행하고 유지할 목적이 아니라
단순히 코드를 실행한 결과를 보여줄 목적이라면,
인터프리터처럼 1회성으로 동작하면 되는 거 아닌가 하는데… ?ㅅ?

그럼 말씀하신대로 Try .Net 과 같은 형태가 될 것같습니다.
근데 AOT 대상은 어떤 걸 의미하는 지 잘 모르겠습니다…
말씀하신 목적과 다른 의미인 거 같다는 느낌적인 느낌… 인데요… 제가 잘못 이해한 것이겠죠?

2개의 좋아요

.NET 6부터 AOT를 통해 네이티브 코드로 Blazor Webassembly로 게시할 수 있게 되었습니다. .NET 5의 인터프린터 방식보다 당연히 많이 빠르고요, .NET 6의 AOT 기능을 이용해 웹브라우저에서 C# 코드를 동적으로 실행하는 방법은 아직까지는 없겠다… 는 이야기였습니다.

그런데 위의 글은 자료 조사 없이 제가 가진 개념과 기존 정보를 가지고 전개한거라… 참고용입니다. 자료조사할 때 정확하게 확인하고 댓글 달아볼께요.

2개의 좋아요

아하! 제가 목적 지향적인 사고를 했군요… ~ㅁ~;;;

웹페이지에서 C# 코드 텍스트 생성 →
AOT 를 이용해 빌드된 네이티브 코드 생성 →
이걸 Blazor wasm 에 넣고 동적으로 렌더링

요게 어려운 거 같다는 얘기로 이해가 됩니다.

그냥 봐도 어려울 거 같아요…

3개의 좋아요

… 라는 건 콘솔 이상의 결과물을 웹페이지에서 렌더링 하겠다는 의도인 걸로 이해되는데

맞나요?ㅅ?

2개의 좋아요

아… 아닙니다. 제가 만드려고 하는 슬로그라는 서비스에서 코드를 웹페이지에서 실행하는 기능은 단지 하나의 기능일 뿐입니다. 이 기능 때문에 서비스를 AOT로 배포하지 못하는 건 사용할 수 없는 무엇으로 보여져서요. (서비스를 Blazor Server로 제공하느냐 Webassembly로 게시하느냐는 것은 좀 더 고민할 내용이지만서도…)

3개의 좋아요

.NET Try 대신 .NET Interactive를 이용할 수 있습니다. (.NET Try GitHub 가보니 .NET 6을 적용하려고 하는 흔적이 보이기는 하네요. 문서등에서 아직은 계획이라던가 어떠한 이야기는 없습니다.) .NET Interactive를 사용하기 위한 학습 방법으로 dotnet-repl의 소스코드를 리뷰하는 방법이 있습니다. 이 프로젝트는 .NET Interactive 및 콘솔 출력을 위해 Spectre.Console을 이용한 프로젝트 입니다.


.NET Interactive를 이용하면 웹브라우저에서 코드가 실행되는 대신 서버에서 실행될 것입니다. 자원 격리 방법이라던가 자원 할당 방법에 대해서 학습하면 현실적으로 가장 확실한 접근 방법이 아닐까 하네요.

1개의 좋아요

아… 오늘 갑자기 생각이 났는데 허들이 없었습니다.

C# 코드를 편집해서 실행하고 그 실행결과를 확인하는 웹어셈블리는 AOT로 배포하지 않고 기존 방식으로 배포해iframe으로 제공하고,
서비스는 별도로 AOT로 배포해도 되는 것이였습니다 ^^;

이제 간단하게 C# 코드를 텍스트 박스에 타이핑하고 실행 버튼을 누르면 그 결과를 출력하는 간단한 Blazor 웹어셈블리를 만들어봐야겠습니다.

3개의 좋아요

시도하시는 김에 F#도…

3개의 좋아요

간단하게 코딩으로 동작확인을 하고 있습니다.

사실 AOT가 아닌 Blazor Webassembly 환경은 완벽한 .NET의 Playgound 입니다. Blazor WASM 환경에서 필요시 마다 .NET dll을 웹브라우저로 불러다가 쓸 수 있거든요. 즉, 어떻게 dll을 불러다 쓸것이냐의 약간의 차이만 있을 뿐이지 Microsoft.CodeAnalysis.CSharp.Scripting을 이용해서 코드를 실행하는 과정은 완전히 동일합니다.

image

현재는 필수 dll을 MetadataReference로 어떻게 포함할 것인가 찾고 있습니다. 구글 검색으로 확인되는 방식은 현재 도메인의 어셈블리 목록의 Location으로 읽어야 할 dll을 찾아 등록하는 방식인데요, 해보니 Location이 빈 문자열이라 동작하지 않습니다.

생각하고 있는 방식은 blazor.boot.jsonresources/assembly의 목록으로 dll을 읽는 것인데요 이 방법이 가장 유망해 보입니다.

그런데 사실 가장 좋은 방법은 이미 로딩된 dll의 어셈블리를 이용해 MetadataReference을 구성해 참조하도록 하는것인데요, 이 방법은 아직은 찾질 못했습니다.

4개의 좋아요

blazor.boot.json을 이용한 방법으로 성공은 했습니다.

image

되기는 되는군요!

5개의 좋아요

일단 된다는 것을 확인했으니까 본 슬로그는 종료합니다.

차후에 동작페이지 및 소스코드를 공유 할께요

4개의 좋아요