Xây dựng ứng dụng bảng điều khiển .NET Core để xuất EXE


413

Đối với dự án ứng dụng bảng điều khiển nhắm mục tiêu .NET Core 1.0, tôi không thể tìm ra cách để .exe xuất ra trong quá trình xây dựng. Dự án chạy tốt trong gỡ lỗi.

Tôi đã thử xuất bản dự án, nhưng nó cũng không hoạt động. Điều này hợp lý vì một tệp EXE sẽ dành riêng cho nền tảng, nhưng phải có một cách. Các tìm kiếm của tôi chỉ xuất hiện tham chiếu đến các phiên bản .NET Core cũ hơn đã sử dụng project.json.

Bất cứ khi nào tôi xây dựng hoặc xuất bản, đây là tất cả những gì tôi nhận được:

Xây dựng thư mục



2
@geekzster xin vui lòng phục hồi - Tôi biết bạn đã không trả lời câu hỏi OP, nhưng bạn đã trả lời câu hỏi của tôi và tôi nghi ngờ điều đó của nhiều người khác bằng cách nói dotnet <path>.dll(Tôi đã không suy nghĩ và gõ dotnet run <path>.dllmà không thành công vì lý do rõ ràng)! (Theo phản ánh sẽ tốt nếu câu hỏi này được đóng lại có lợi cho câu hỏi khác có bộ câu trả lời tương tự)
Ruben Bartelink

Câu trả lời:


480

Đối với mục đích gỡ lỗi, bạn có thể sử dụng tệp DLL. Bạn có thể chạy nó bằng cách sử dụng dotnet ConsoleApp2.dll. Nếu bạn muốn tạo tệp EXE, bạn phải tạo một ứng dụng độc lập.

Để tạo một ứng dụng độc lập (EXE trong Windows), bạn phải chỉ định thời gian chạy đích (dành riêng cho hệ điều hành mà bạn nhắm mục tiêu).

Chỉ Pre-.NET Core 2.0 : Đầu tiên, thêm định danh thời gian chạy của thời gian chạy đích trong tệp .csproj ( danh sách các RID được hỗ trợ ):

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

Bước trên không còn bắt buộc với .NET Core 2.0 .

Sau đó, đặt thời gian chạy mong muốn khi bạn xuất bản ứng dụng của mình:

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

15
Tôi nghĩ rằng điều này có thể được thực hiện chỉ với CLI. BTW, bắt đầu với .net core 2, bạn không cần đặt RuntimeIdentifiertrong csproj.
meziantou

26
Đối với .NET Core 2.0, điều này có thể được thực hiện trong Visual Studio không? Hoặc tôi phải gõ các lệnh này bằng tay?
Tomasz Sikora

77
Hơn 60MB cho ứng dụng bảng điều khiển Hello world!
shox

13
@mikolaj Chỉ có một mục tiêu thời gian chạy "xách tay". Có cách nào để đưa tất cả các mục tiêu vào? Tôi ổn với việc sử dụng dòng lệnh, tuy nhiên nghĩ rằng đó là một bước lùi.
gsharp

10
Điều này không tạo ra một thực thi độc lập. Điều này tạo ra một tệp thực thi, cùng với một loạt các tệp khác (ý ​​tôi là trong thư mục phát hành). Bao gồm một số thư mục con với các tập tin riêng của họ. Có cách nào để tạo ra một thực thi độc lập thực sự?
Matthew

122

CẬP NHẬT (31 tháng 10 năm 2019)

Đối với bất kỳ ai muốn làm điều này thông qua GUI và:

  • Đang sử dụng Visual Studio 2019
  • Đã cài đặt .NET Core 3.0 (có trong phiên bản mới nhất của Visual Studio 2019)
  • Muốn tạo một tập tin duy nhất

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Ghi chú

Lưu ý kích thước tệp lớn cho một ứng dụng nhỏ như vậy

Nhập mô tả hình ảnh ở đây

Bạn có thể thêm thuộc tính "PublishTrimmed". Ứng dụng sẽ chỉ bao gồm các thành phần được sử dụng bởi ứng dụng. Thận trọng : không làm điều này nếu bạn đang sử dụng sự phản chiếu

Nhập mô tả hình ảnh ở đây

Xuất bản lại

Nhập mô tả hình ảnh ở đây


Bài trước

Đối với bất kỳ ai đang sử dụng Visual Studio và muốn thực hiện điều này qua GUI, hãy xem các bước bên dưới:

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây

Nhập mô tả hình ảnh ở đây


19
Quá tệ, đầu ra là một loạt các tệp, không chỉ một EXE như .NET Framework cũ.
Tomas Karban

2
@Tomas Karban - Đó là trường hợp cho đến khi tôi thay đổi chế độ triển khai thành "khép kín" Sau khi thay đổi tệp exe cũng xuất hiện trong thư mục xuất bản :-)
Mariusz

@TomasKarban .NET Core không phải là thời gian chạy mục đích chung. Nó được thiết kế đặc biệt cho 1) triển khai đám mây / container, 2) đa nền tảng. Nó cũng có nghĩa là tạm thời - nó chỉ là một bản hack "nhanh" cho đến khi tất cả .NET có thể được tạo thành nguồn mở. .NET 5.0 sẽ là mục đích chung tiếp theo .NET.
Luaan

3
Tuy nhiên, thật nực cười khi IDE cho .NET đơn giản là không hỗ trợ các chức năng cơ bản nhất khi bạn nhắm mục tiêu .NET Core. Và đó là những gì mọi người phải nhắm mục tiêu để tạo các ứng dụng dòng lệnh đa nền tảng - giả sử, một trình biên dịch.
Phục hồi lại

18

Sau đây sẽ tạo ra, trong thư mục đầu ra,

  • tất cả các tài liệu tham khảo gói
  • lắp ráp đầu ra
  • exe bootstrapping

Nhưng nó không chứa tất cả các cụm thời gian chạy .NET Core.

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

Tôi đã gói nó trong một mẫu ở đây: https://github.com/SimonCropp/NetCoreConsole


ngoại trừ ($ Temp) trỏ đến c: \ Users \ xxx \ AppData \ Local \ Temp mà rõ ràng không thể xóa / làm sạch - cũng không thể làm như vậy
Adaptabi

1
@Adaptabi Temp được định nghĩa là một tài sản khi bắt đầu tập lệnh
Simon

2

Nếu tệp .bat có thể chấp nhận được, bạn có thể tạo tệp dơi có cùng tên với tệp DLL (và đặt tệp đó vào cùng thư mục), sau đó dán vào nội dung sau:

dotnet %~n0.dll %*

Rõ ràng, điều này giả định rằng máy đã cài đặt .NET Core và có sẵn trên toàn cầu.

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

(Câu trả lời này bắt nguồn từ nhận xét của Chet .)


0

Đây là cách giải quyết khó khăn của tôi - tạo một ứng dụng bảng điều khiển (.NET Framework) để đọc tên và đối số của chính nó, sau đó gọi dotnet [nameOfExe].dll [args].

Tất nhiên điều này giả định rằng .NET được cài đặt trên máy đích.

Đây là mã. Hãy sao chép!

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
Nếu bạn sắp có một tệp bổ sung, tại sao không chỉ tạo một tệp bat có chứadotnet [nameOfExe].dll %*
Chet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.