EXE çıktısı almak için .NET Core konsol uygulaması oluşturun


413

.NET Core 1.0'ı hedefleyen bir konsol uygulaması projesi için, derleme sırasında bir .exe dosyasının nasıl alınacağını bulamıyorum. Proje hata ayıklamada iyi çalışıyor.

Projeyi yayınlamayı denedim, ama bu da işe yaramıyor. Bir EXE dosyası platforma özgü olacağı için mantıklı, ancak bir yol olmalı. Aramalarım sadece project.json kullanan eski .NET Core sürümlerine başvurdu.

Ne zaman inşa edersem ya da yayınlıyorsam, elde edeceğim şey budur:

Derleme dizini



2
@geekzster lütfen silme işlemini geri al - OP sorusuna cevap vermediğini biliyorum, ama benimkine cevap verdin ve birçok kişinin bundan şüpheleniyorum dotnet <path>.dll( dotnet run <path>.dllbariz nedenlerle başarılı olmadan düşünmüyordum ve yazmıyordum )! (Yansıtma üzerine, benzer bir cevap kümesine sahip olan diğer soru lehine kapatılması iyi olurdu)
Ruben Bartelink

Yanıtlar:


480

Hata ayıklama amacıyla, DLL dosyasını kullanabilirsiniz. Tuşunu kullanarak çalıştırabilirsiniz dotnet ConsoleApp2.dll. Bir EXE dosyası oluşturmak istiyorsanız, bağımsız bir uygulama oluşturmanız gerekir.

Bağımsız bir uygulama oluşturmak için (Windows'ta EXE), hedef çalışma zamanını (hedeflediğiniz işletim sistemine özgü) belirtmeniz gerekir.

Yalnızca Pre-.NET Core 2.0 : İlk olarak, hedef çalışma zamanlarının çalışma zamanı tanımlayıcısını .csproj dosyasına ( desteklenen RID'lerin listesi ) ekleyin :

<PropertyGroup>
    <RuntimeIdentifiers>win10-x64;ubuntu.16.10-x64</RuntimeIdentifiers>
</PropertyGroup>

Yukarıdaki adım artık .NET Core 2.0'dan başlayarak gerekli değildir .

Ardından, uygulamanızı yayınlarken istediğiniz çalışma zamanını ayarlayın:

dotnet publish -c Release -r win10-x64
dotnet publish -c Release -r ubuntu.16.10-x64

15
Bunun sadece CLI ile yapılabileceğini düşünüyorum. BTW, .net core 2 ile başlayarak RuntimeIdentifier, csproj'da ayarlamanıza gerek yoktur.
meziantou

26
.NET Core 2.0 için bu Visual Studio'da yapılabilir? Yoksa bu komutları elle mi yazmalıyım?
Tomasz Sikora

77
Merhaba dünya konsolu uygulaması için 60 MB'tan fazla!
shox

13
@mikolaj Sadece bir hedef çalışma zamanı "taşınabilir" var. Tüm hedefleri getirmenin bir yolu var mı? Komut satırını kullanmak için sorun değil, ancak bunun bir adım geri olduğunu düşünüyorum.
18

10
Bu bağımsız bir yürütülebilir dosya oluşturmaz. Bu, bir dizi başka dosyayla birlikte bir yürütülebilir dosya oluşturur (demek istediğim yayın klasöründe). Bazı alt klasörleri kendi dosyaları ile birlikte. Gerçek bir bağımsız yürütülebilir dosya oluşturmanın bir yolu var mı ?
Matthew

122

GÜNCELLEME (31 EKİM 2019)

Bunu bir GUI aracılığıyla yapmak isteyen herkes için ve:

  • Visual Studio 2019 kullanıyor
  • .NET Core 3.0 yüklü (Visual Studio 2019'un en son sürümüne dahil edilmiştir)
  • Tek bir dosya oluşturmak istiyor

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Not

Böyle küçük bir uygulama için büyük dosya boyutuna dikkat edin

Resim açıklamasını buraya girin

"PublishTrimmed" özelliğini ekleyebilirsiniz. Uygulama yalnızca uygulama tarafından kullanılan bileşenleri içerecektir. Dikkat : yansıma kullanıyorsanız bunu yapmayın

Resim açıklamasını buraya girin

Tekrar yayınla

Resim açıklamasını buraya girin


Önceki yazı

Visual Studio kullanan ve bunu GUI aracılığıyla yapmak isteyen herkes için aşağıdaki adımlara bakın:

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin

Resim açıklamasını buraya girin


19
Çok kötü çıktı sadece bir EXE eski .NET Framework gibi bir grup dosya değil.
Tomas Karban

2
@Tomas Karban - Dağıtım modunu "müstakil" olarak değiştirene kadar durum buydu. Değişiklik exe dosyası yayınlama klasöründe de göründükten sonra :-)
Mariusz

@TomasKarban .NET Core genel amaçlı bir çalışma zamanı değildir. 1) bulut / konteyner dağıtımı, 2) çoklu platform için özel olarak tasarlanmıştır. Ayrıca geçici olması gerekiyordu - tüm .NET açık kaynaklı hale getirilinceye kadar sadece "hızlı" bir saldırı. .NET 5.0 bir sonraki genel amaçlı .NET olacaktır.
Luaan

3
Yine de, IDE for .NET'in .NET Core'u hedeflerken en temel işlevselliği desteklememesi saçmadır. Ve herkesin platformlar arası komut satırı uygulamaları (örneğin, bir derleyici) oluşturmak için hedeflemesi gerekir.
Monica

18

Çıktı dizininde aşağıdakiler üretilecek,

  • tüm paket referansları
  • çıkış düzeneği
  • önyükleme exe

Ancak tüm .NET Core çalışma zamanı derlemelerini içermez.

<PropertyGroup>
  <Temp>$(SolutionDir)\packaging\</Temp>
</PropertyGroup>

<ItemGroup>
  <BootStrapFiles Include="$(Temp)hostpolicy.dll;$(Temp)$(ProjectName).exe;$(Temp)hostfxr.dll;"/>
</ItemGroup>

<Target Name="GenerateNetcoreExe"
        AfterTargets="Build"
        Condition="'$(IsNestedBuild)' != 'true'">
  <RemoveDir Directories="$(Temp)" />
  <Exec
    ConsoleToMSBuild="true"
    Command="dotnet build $(ProjectPath) -r win-x64 /p:CopyLocalLockFileAssemblies=false;IsNestedBuild=true --output $(Temp)" >
    <Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
  </Exec>
  <Copy
    SourceFiles="@(BootStrapFiles)"
    DestinationFolder="$(OutputPath)"
  />

</Target>

Buraya bir örnekte tamamladım: https://github.com/SimonCropp/NetCoreConsole


Açıkçası / kaldırılır temizlenemez \ xxx \ AppData \ Local \ Temp Kullanıcılar \ - ne de bunu yapmak için adviceable geçerli: Benim c noktaları ($ Temp) hariç
Adaptabi

1
@Adaptabi Temp senaryonun başlangıcında bir mülk olarak tanımlanıyor
Simon

2

Bir .bat dosyası kabul edilebilirse, DLL dosyasıyla aynı ada sahip bir yarasa dosyası oluşturabilir (ve aynı klasöre yerleştirebilirsiniz), ardından aşağıdaki içeriğe yapıştırabilirsiniz:

dotnet %~n0.dll %*

Açıkçası, bu makinede .NET Core kurulu ve dünya genelinde kullanılabilir olduğu varsayılmaktadır.

c:\> "path\to\batch\file" -args blah

(Bu cevap Chet'in yorumundan alınmıştır .)


0

İşte benim hacky geçici çözüm - kendi adını ve bağımsız değişkenleri okuyan bir konsol uygulaması (.NET Framework) oluşturmak ve sonra çağırır dotnet [nameOfExe].dll [args].

Tabii ki bu, .NET'in hedef makineye yüklendiğini varsayar.

İşte kod. Kopyalamaktan çekinmeyin!

using System;
using System.Diagnostics;
using System.Text;

namespace dotNetLauncher
{
    class Program
    {
        /*
            If you make .NET Core applications, they have to be launched like .NET blah.dll args here
            This is a convenience EXE file that launches .NET Core applications via name.exe
            Just rename the output exe to the name of the .NET Core DLL file you wish to launch
        */
        static void Main(string[] args)
        {
            var exePath = AppDomain.CurrentDomain.BaseDirectory;
            var exeName = AppDomain.CurrentDomain.FriendlyName;
            var assemblyName = exeName.Substring(0, exeName.Length - 4);
            StringBuilder passInArgs = new StringBuilder();
            foreach(var arg in args)
            {
                bool needsSurroundingQuotes = false;
                if (arg.Contains(" ") || arg.Contains("\""))
                {
                    passInArgs.Append("\"");
                    needsSurroundingQuotes = true;
                }
                passInArgs.Append(arg.Replace("\"","\"\""));
                if (needsSurroundingQuotes)
                {
                    passInArgs.Append("\"");
                }

                passInArgs.Append(" ");
            }
            string callingArgs = $"\"{exePath}{assemblyName}.dll\" {passInArgs.ToString().Trim()}";

            var p = new Process
            {
                StartInfo = new ProcessStartInfo("dotnet", callingArgs)
                {
                    UseShellExecute = false
                }
            };

            p.Start();
            p.WaitForExit();
        }
    }
}

6
Yine de başka bir dosyaya sahip olacaksanız, neden sadece içeren bir bat dosyası oluşturmuyorsunuzdotnet [nameOfExe].dll %*
Chet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.