.NET 애플리케이션을 네이티브 코드로 컴파일하는 방법은 무엇입니까?


89

.NET 프레임 워크를 사용할 수없는 컴퓨터에서 .NET 응용 프로그램을 실행하려는 경우; 애플리케이션을 네이티브 코드로 컴파일하는 방법이 있습니까?

답변:


45

Microsoft에는 MSIL을 네이티브 코드로 컴파일 하는 방법을 설명하는 기사가 있습니다.

Ngen 을 사용할 수 있습니다 .

네이티브 이미지 생성기 (Ngen.exe)는 관리되는 응용 프로그램의 성능을 향상시키는 도구입니다. Ngen.exe는 컴파일 된 프로세서 별 기계어 코드를 포함하는 파일 인 네이티브 이미지를 만들어 로컬 컴퓨터의 네이티브 이미지 캐시에 설치합니다. 런타임은 JIT (Just-In-Time) 컴파일러를 사용하여 원본 어셈블리를 컴파일하는 대신 캐시의 네이티브 이미지를 사용할 수 있습니다.

불행히도 프로그램을 실행하려면 프레임 워크의 라이브러리가 여전히 필요합니다. 필요한 모든 파일을 단일 실행 파일로 컴파일 할 수있는 MS .Net 프레임 워크 SDK에는 내가 아는 기능이 없습니다.


1
공연 외에 다른 이유를 찾지 못했습니다. CLR 코드는 여전히 이전과 같이 읽을 수 있으며 여전히 .NET이 필요합니다. 마이크로 소프트 실망하는 나는 큰 문제라고 생각 무엇을 해결하는 것입니다 도구와 함께 제공하지 않았다 그래서 (그대로 사람은 높은 수준의 코드를 볼 수 있습니다)
MasterMastic

나는 Espo에 동의하지 않습니다. 회색으로 표시된 텍스트는 CLR을 의미하는 "런타임"을 의미하므로 Chris가 올바르게 지적한대로 그림에 나오는 .NET Framework를 의미합니다. 그러나 NGen 포인트는 사실입니다. 문제는 CLR / Runtime / .NET Framework를 사용하지 않으면 모두 동일하다는 것입니다.
Jasmine

1
- 그것은 .NET 프레임 워크와 같은 외모가 드디어 네이티브 컴파일러를지고, 시간이 그러나 흥분하는 것입니다 msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder

.NET 실행 파일과 종속성 트리의 모든 항목을 ILMerge 한 다음 .NET과 독립적 인 실행 파일을 원하는 경우 Ngen을 선택하십시오 .

24

RemoteSoft는 .NET 응용 프로그램을 .NET 설치없이 실행할 수있는 패키지로 컴파일하는 도구를 만듭니다. 나는 그것에 대한 경험이 없습니다.

RemoteSoft 도롱뇽


5
프레임 워크 없이도 할 수있는 유일한 도구입니다. 물론 비용은 $ 1249입니다.
Slapout

3
정보 나 평가를 받기 위해 지난 몇 년 동안 몇 번 시도했지만 가격이나 데모에 대한 이메일을 보내지 않아서 그들의 제품이 약간 의심 스러울 수 있다고 생각합니다.
codenheim 2014 년

21

여기에 언급 된 다른 답변 중 일부가 언급했듯이 .NET 네이티브 도구를 사용하여 앱을 네이티브 기계어 코드로 컴파일 할 수 있습니다. 그러나 그 답변과 달리 방법 을 설명 하겠습니다.

단계 :

  1. 새 .NET Core 도구 체인의 일부인 dotnet CLI (명령 줄 인터페이스) 도구를 설치합니다 . 이것을 사용하여 앱을 컴파일합니다. 여기 에서 좋은 기사를 찾을 수 있습니다.

  2. 셸 프롬프트를 열고 cd앱 디렉터리로 이동합니다.

  3. 이것을 입력하십시오 :

    dotnet compile --native
    

그게 다야! 완료되면 앱이 다음과 같이 단일 바이너리로 컴파일됩니다.

네이티브 컴파일 된 .NET Core EXE

독립 실행 형 실행 파일이됩니다. PDB, 어셈블리 또는 구성 파일이 포함되어 있지 않습니다 (만세!).


또는 더 빠른 프로그램을 원하면 다음을 실행할 수 있습니다.

dotnet compile --native --cpp

그러면 C ++ 코드 생성기 (RyuJIT와 반대)를 사용하여 프로그램을 최적화하므로 앱이 AOT 시나리오에 더욱 최적화됩니다.

dotnet CLI GitHub repo 에서 이에 대한 자세한 정보를 찾을 수 있습니다 .


참고 : 이는 .NET Core로 빌드 된 프로젝트에 대해서만 지원됩니다. (하지만 +1)
Mahmoud Al-Qudsi

.NET Native에 Windows 10이 필요하다는 매우 중요한 세부 사항을 잊어 버렸습니다.
Elmue

.net core 3.1에서 작동하지 않는 것 같습니다.
user1005462

19

나는 그중 몇 가지를 테스트했으며 현재 .NET 3.5를 지원하고 훌륭한 가상화 스택을 가진 유일한 것은 Xenocode Postbuild입니다.

ngen을 사용하는 경우에도 .NET 프레임 워크를 설치해야하지만 도구를 사용하면 모든 관리 코드가 네이티브 코드로 컴파일되므로 프레임 워크없이 머신에 배포 할 수 있습니다.



11

예, 네이티브 이미지 생성기 인 Ngen을 사용 합니다. 그러나 알아야 할 몇 가지 사항이 있습니다.

  • 실행 파일을 실행하려면 여전히 CLR이 필요합니다.
  • CLR은 실행되는 환경에 따라 어셈블리를 동적으로 최적화하지 않습니다 (예 : 486 vs. 586 vs. 686 등).

대체로 애플리케이션의 시작 시간을 줄여야하는 경우에만 Ngen을 사용할 가치가 있습니다.


9

할 수 있습니다! 그러나 .NET 1.1로 제한됩니다 (제네릭 없음) : Mono Ahead-Of-Time 컴파일 (AOT)

그러나 이것은 컴파일이 실제로 네이티브라는 것을 의미하므로 더 이상 단일 바이트 코드 어셈블리를 배포 할 수 없으며 플랫폼 당 하나씩 필요합니다.

원래 iPhone 용 .NET이나 Mono가 없기 때문에 설계 되었기 때문에 MonoTouch를 만들었습니다.


6

.NET Native라는 새로운 사전 컴파일 기술을 사용하여이를 수행 할 수 있습니다. 여기에서 확인하십시오 : http://msdn.microsoft.com/en-US/vstudio/dotnetnative

현재는 Windows Store 앱에서만 사용할 수 있습니다. 단일 구성 요소 연결을 수행합니다. 따라서 .NET Framework 라이브러리는 앱에 정적으로 연결됩니다. 모든 것이 네이티브로 컴파일되고 IL 어셈블리가 더 이상 배포되지 않습니다. 앱은 CLR에 대해 실행되지 않지만 관리되는 런타임 (Mrt.dll)이라는 제거되고 최적화 된 런타임입니다.

위에서 언급했듯이 NGEN은 혼합 컴파일 모델을 사용하고 동적 시나리오를 위해 IL 및 JIT에 의존했습니다. .NET Native는 JIT를 사용하지 않지만 다양한 동적 시나리오를 지원합니다. 코드 작성자는 런타임 지시문 을 활용 하여 지원하려는 동적 시나리오에 대한 .NET 네이티브 컴파일러에 힌트를 제공해야합니다.


1
+1-이런 일이 일어나기를 몇 년 동안 기다려 왔습니다. "가상 머신"에 대한 세계의 열광이 더 빨리 진행되기를 바랐지만 그럼에도 불구하고 일어나고 있습니다. 나는 우리가 네이티브 컴파일의 부활을 보게 될 것으로 기대합니다. 당신이 말했듯이, 현재 윈도우즈 스토어 앱을위한 것이지만, 데스크톱 시장이 동등한 대우를 요구하는 것은 시간 문제 일뿐입니다.
codenheim 2014 년

4

ngen.exe를 사용하여 네이티브 이미지를 생성 할 수 있지만 원본이 아닌 원본 코드도 배포해야하며 대상 컴퓨터에 프레임 워크를 설치해야합니다.

정말 문제가 해결되지 않습니다.


2

2019 답변 : dotnet / corert를 사용하십시오 . .NET Core 프로젝트를 독립 실행 형 .exe파일 로 컴파일 할 수 있습니다. 종속성이 없습니다 (와 같은 시스템 라이브러리 제외 kernel32.dll). 나는 이것이 OP에 정확히 필요한 것이라고 확신합니다.

GitHub 홈페이지에서 :

CoreRT 컴파일러는 관리되는 .NET Core 애플리케이션을 배포하기 쉬운 네이티브 (아키텍처 특정) 단일 파일 실행 파일로 컴파일 할 수 있습니다. 또한 다른 프로그래밍 언어로 작성된 애플리케이션에서 사용할 수있는 독립 실행 형 동적 또는 정적 라이브러리를 생성 할 수도 있습니다.


1

.NET의 특성은 MSIL로 컴파일 된 앱을 설치 한 다음 JIT 또는 Ngen에 의해 MSIL이 네이티브 코드로 컴파일되고 캐시에 로컬로 저장되는 것입니다. .NET 프레임 워크와 독립적으로 실행할 수있는 진정한 네이티브 .exe를 생성하기위한 것이 아닙니다.

이 작업을 수행하는 해킹이있을 수 있지만 안전하지 않은 것 같습니다. 동적 어셈블리 로딩, MSIL 코드 생성 등과 같이 프레임 워크를 필요로하는 역학이 너무 많습니다.


0

Native로 컴파일하는 주된 이유는 코드를 보호하기위한 것입니다. 그렇지 않으면 컴파일 된 MSIL이 클라이언트 컴퓨터에 소스 코드를 배포하는 것과 같습니다.

NGEN은 네이티브로 컴파일되지만 IL 코드를 배포해야합니다.이 목적은 시작 시간을 줄이기위한 것이지만 쓸모가 없습니다.

CoreRt는 알파 버전이며 간단한 helloworld 유형 앱에서만 작동합니다.

.Net Core는 단일 실행 파일로 컴파일되지만 원시 exe도 아닙니다. 이것은 IL 코드의 압축 파일 일 뿐이며 실행 중에 코드를 임시 폴더에 압축 해제합니다.

Microsoft의 간단한 질문은 RyuJIT가 IL을 즉석에서 네이티브로 컴파일 할 수 있다면 동일한 IL AOT (Ahead-of-Time)를 컴파일 할 수 없다는 것입니다.


"CoreRt는 알파 버전이며 간단한 helloworld 유형 앱에서만 작동합니다." 이것은 사실이 아닙니다. Steam 에는 helloworld보다 복잡한 게임이 있습니다 (예 : streets4rage.com ).
S Waye

그러나 CoreRT는 Winform 응용 프로그램을 컴파일 할 수 없습니다. Winform 응용 프로그램 ( dotnetnative.online )을 컴파일 할 수있는 다른 온라인 컴파일러를 찾았습니다.
Rahim



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.