एक EXE आउटपुट के लिए .NET कोर कंसोल एप्लिकेशन बनाएं


413

कंसोल अनुप्रयोग प्रोजेक्ट के लिए .NET कोर 1.0 को लक्षित करते हुए, मैं यह नहीं समझ सकता कि निर्माण के दौरान आउटपुट को .exe कैसे प्राप्त किया जाए। प्रोजेक्ट डिबग में ठीक चलता है।

मैंने प्रोजेक्ट प्रकाशित करने की कोशिश की है, लेकिन वह भी काम नहीं करता है। यह समझ में आता है क्योंकि एक EXE फ़ाइल प्लेटफ़ॉर्म-विशिष्ट होगी, लेकिन एक तरीका होना चाहिए। मेरी खोजों ने केवल पुराने .NET कोर संस्करणों का संदर्भ दिया है जो Project.json का उपयोग करते हैं।

जब भी मैं निर्माण या प्रकाशित करता हूं, यह सब मुझे मिलता है:

निर्देशिका बनाएँ



2
@geekzster कृपया अनिर्धारित करें - मुझे पता है कि आपने ओपी प्रश्न का उत्तर नहीं दिया था, लेकिन आपने मेरा उत्तर दिया, और मुझे कई अन्य लोगों का संदेह है कि dotnet <path>.dllमैं ( dotnet run <path>.dllस्पष्ट कारणों से सफलता के बिना सोच और टाइप नहीं कर रहा था )! (प्रतिबिंब पर यह अच्छा होगा यदि इसे दूसरे प्रश्न के जवाब में बंद कर दिया जाए जिसके समान उत्तरों का एक सेट है)
रूबेन बार्टेलिंक

जवाबों:


480

डीबगिंग उद्देश्यों के लिए, आप DLL फ़ाइल का उपयोग कर सकते हैं। आप इसका उपयोग करके चला सकते हैं dotnet ConsoleApp2.dll। यदि आप एक EXE फ़ाइल बनाना चाहते हैं, तो आपको एक स्व-निहित एप्लिकेशन जेनरेट करना होगा।

स्व-निहित एप्लिकेशन (विंडोज में ईएक्सई) उत्पन्न करने के लिए, आपको लक्ष्य रनटाइम (जो आपके द्वारा लक्षित ऑपरेटिंग सिस्टम के लिए विशिष्ट है) को निर्दिष्ट करना होगा।

Pre-.NET Core 2.0 केवल : सबसे पहले, लक्ष्य रनटाइम में .csproj फ़ाइल ( समर्थित RID की सूची ) के रनटाइम पहचानकर्ता को जोड़ें :

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

उपरोक्त कदम अब .NET कोर 2.0 के साथ शुरू करने की आवश्यकता नहीं है

जब आप अपना आवेदन प्रकाशित करते हैं, तब वांछित रनटाइम सेट करें:

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

15
मुझे लगता है कि यह केवल सीएलआई के साथ किया जा सकता है। BTW, .net core 2 के साथ शुरू, आपको RuntimeIdentifiercsproj में सेट करने की आवश्यकता नहीं है ।
मेज़ियांटौ सेप

26
.NET कोर 2.0 के लिए यह विजुअल स्टूडियो में किया जा सकता है? या मुझे ये कमांड हाथ से टाइप करनी चाहिए?
टॉमस सिकोरा

77
हैलो वर्ल्ड कंसोल ऐप के लिए 60 एमबी से अधिक!
shox

13
@ मिकोलाज केवल एक लक्ष्य रनटाइम "पोर्टेबल" है। क्या सभी लक्ष्यों को लाने का एक तरीका है? मैं कमांड लाइन का उपयोग करने के लिए ठीक हूं, हालांकि सोचें कि यह एक कदम पीछे है।
gsharp

10
यह एक स्टैंडअलोन निष्पादन योग्य नहीं बनाता है। यह एक निष्पादन योग्य बनाता है, साथ में अन्य फ़ाइलों के एक होस्ट (रिलीज फ़ोल्डर में मेरा मतलब है)। कुछ सबफ़ोल्डर्स को अपनी फ़ाइलों के साथ शामिल करना। क्या एक सही स्टैंडअलोन निष्पादन योग्य बनाने का एक तरीका है ?
मैथ्यू

121

UPDATE (31-OCT-2019)

कोई भी जो GUI के माध्यम से ऐसा करना चाहता है और:

  • विजुअल स्टूडियो 2019 का उपयोग कर रहा है
  • .NET .NET 3.0 स्थापित है (विजुअल स्टूडियो 2019 के नवीनतम संस्करण में शामिल)
  • एक एकल फ़ाइल उत्पन्न करना चाहता है

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

ध्यान दें

इतने छोटे अनुप्रयोग के लिए बड़े फ़ाइल आकार पर ध्यान दें

यहां छवि विवरण दर्ज करें

आप "PublishTrimmed" गुण जोड़ सकते हैं। आवेदन में केवल उन घटकों को शामिल किया जाएगा जो अनुप्रयोग द्वारा उपयोग किए जाते हैं। सावधानी : यदि आप प्रतिबिंब का उपयोग कर रहे हैं तो ऐसा न करें

यहां छवि विवरण दर्ज करें

फिर से प्रकाशित करें

यहां छवि विवरण दर्ज करें


पिछला पद

कोई भी व्यक्ति जो Visual Studio का उपयोग कर रहा है और GUI के माध्यम से ऐसा करना चाहता है, नीचे दिए गए चरणों को देखें:

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


19
बहुत बुरा आउटपुट फ़ाइलों का एक गुच्छा है, पुराने .NET फ्रेमवर्क की तरह सिर्फ एक EXE नहीं।
टॉमस करबान

2
@ टोमस कर्बन - यह तब तक था जब तक कि मैं तैनाती मोड को "सेल्फ-निहित" में नहीं बदल देता था, चेंज एक्सई फाइल के बाद पब्लिश फोल्डर में भी दिखाई देता था :-)
Mariusz

@TomasKarban .NET कोर एक सामान्य उद्देश्य रनटाइम नहीं है। यह विशेष रूप से 1) क्लाउड / कंटेनर परिनियोजन, 2) बहु-मंच के लिए डिज़ाइन किया गया है। यह भी अस्थायी होने का मतलब है - यह केवल एक "त्वरित" हैक है जब तक कि .NET के सभी को खुला स्रोत नहीं बनाया जा सकता है। .NET 5.0 अगला सामान्य उद्देश्य .NET होने जा रहा है।
लुआं

3
फिर भी, यह हास्यास्पद है कि जब आप .NET कोर को लक्षित कर रहे हों, तो .NET के लिए IDE सबसे बुनियादी कार्यक्षमता का समर्थन नहीं करता है। और यही कि सभी को क्रॉस-प्लेटफ़ॉर्म कमांड लाइन एप्लिकेशन बनाने के लिए लक्षित करना चाहिए - कहते हैं, एक संकलक।
मोनिका

18

निम्नलिखित उत्पादन निर्देशिका में उत्पादन करेगा,

  • सभी पैकेज संदर्भ
  • आउटपुट असेंबली
  • बूटस्ट्रैपिंग एक्सई

लेकिन इसमें सभी .NET कोर रनटाइम असेंबली शामिल नहीं हैं।

<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>

मैंने इसे यहां एक नमूने में लपेटा: https://github.com/SimonCropp/NetCoreConsole


($ Temp) को छोड़कर मेरे c: \ Users \ xxx \ AppData \ Local \ Temp को इंगित करता है जिसे स्पष्ट रूप से हटाया नहीं जा सकता / साफ किया जा सकता है - और न ही ऐसा करने की सलाह दी जाती है
Adaptabi

1
@ Adaptabi Temp स्क्रिप्ट की शुरुआत में एक संपत्ति के रूप में परिभाषित करता है
साइमन

2

यदि .bat फ़ाइल स्वीकार्य है, तो आप DLL फ़ाइल (और इसे उसी फ़ोल्डर में रखें) के समान नाम के साथ एक बैट फ़ाइल बना सकते हैं, फिर निम्न सामग्री में पेस्ट करें:

dotnet %~n0.dll %*

जाहिर है, यह मानता है कि मशीन में .NET कोर स्थापित है और विश्व स्तर पर उपलब्ध है।

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

(यह जवाब चेत की टिप्पणी से लिया गया है ।)


0

यहाँ मेरा हैकी वर्कअराउंड है - एक कंसोल एप्लिकेशन (.NET फ्रेमवर्क) उत्पन्न करता है जो अपना नाम और तर्क पढ़ता है, और फिर कॉल करता है dotnet [nameOfExe].dll [args]

बेशक यह मानता है कि लक्ष्य मशीन पर .NET स्थापित है।

यहाँ कोड है। नकल करने के लिए स्वतंत्र महसूस करो!

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
यदि आप किसी भी तरह से एक अतिरिक्त फ़ाइल रखने जा रहे हैं, तो बस एक बल्ला फ़ाइल क्यों न बनाएंdotnet [nameOfExe].dll %*
Chet
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.