【问题标题】:Build same Project as Console and DLL构建与控制台和 DLL 相同的项目
【发布时间】:2016-12-23 17:30:49
【问题描述】:

我在 Visual Studio 中有一个 C# 项目,它的输出类型为 Console Application

但我还需要此项目的Class Library 以获得另一个解决方案。

现在每次都要切换输出类型,不知道能不能同时生成exedllbuild-event

这个有post-build-event吗?

【问题讨论】:

  • 您是否有机会寻找编译器选项

标签: c# visual-studio post-build-event


【解决方案1】:

我有类似的要求,在这篇文章或任何地方都找不到任何明确的答案。我目前有一个类库,想在不复制任何代码的情况下创建一个控制台应用程序项目。理想情况下应该有两个项目,一个用于创建控制台应用程序,另一个用于创建类库。这也是视觉工作室的建议。当我尝试运行类库时,收到以下消息。

它明确要求我们将可执行项目添加到解决方案中并添加对库项目的引用。

以下是执行此操作的步骤。

右键解决方案->添加新项目->控制台应用程序->选择名称->确定。

右键单击控制台项目->添加引用->在引用管理器中,单击项目选项卡并选择另一个项目(在我的情况下这是类库项目,如果它没有列出,只需单击浏览并选择 .csproj 文件)-> 好的。

现在要使用其他项目中的类,简单的做using LibraryProjectNameSpace

我们到了。宾果游戏!!!!

Also as mentioned in the other answers it is not possible to have the same project generate both .exe and .dll. But you can have the same solution generate these two guys by having two projects. In this way there is no need to switch the output of the project every time.

仅供参考,我使用 Visual Studio 2017

【讨论】:

    【解决方案2】:

    通常的解决方案是使用具有两个项目的解决方案:

    • 包含所有代码的类库(构建到 DLL 中)
    • 一个控制台应用程序引用了其Main 只是调用一些函数的库。

    更多信息,请查看MSDN page on Solutions

    Codor 建议手动将文件添加到 Console 项目,但一个缺点是构建设置不会在两个版本之间共享,因此您可能会遇到一些不一致。

    【讨论】:

    • 这就是我正在做的事情,我的解决方案将“控制台应用程序”编译为 DLL。我不能让它输出一个EXE。您的链接没有帮助。
    • @HackSlash 提出一个新问题,提供有关您的设置的足够详细信息,以便我们为您提供帮助!
    • 我的问题是 .net 核心。它不像你期望的那样工作。我不建议将它用于控制台应用程序。
    【解决方案3】:

    通常可以引用 .net exe 程序集,因为它是类库。

    因此,您可以坚持创建一个 exe 文件并在您的其他项目中引用该 exe(听起来很奇怪,但有效)。

    这是用于浏览参考的对话框。如您所见,您可以选择 exe 文件。

    但是正如评论的那样,这实际上取决于您的用例是什么。 我不建议向您的客户发送带有入口点的 exe,希望客户不会发现该 exe。但是你可以做的是有条件地编译你的入口点。

    例如

    class Program {
      // This is the entry point of the EXE
      public static void Main() {
    #if DEBUG
      // Start Debug Application
      ...
    #else
      // Shipped to client - Entry point disabled
      return;
    #endif
      }
    }
    

    如果有一个相关的原因有一个交付的 exe 和一个交付的类库,我会像这样重构你的解决方案:

    • (A) 完整的应用程序 (.sln)
      • (B) 引用 (C) 的控制台应用程序 (.csproj)
      • (C) 类库项目 (.csproj)

    这样一来,其他人就非常清楚,有一个应用程序使用该库和该库本身。

    【讨论】:

    • 虽然可行,但不建议这样做,因为通常您不会将 exe 发送给您的客户。而是打包在一起或只有消耗的dll的
    • 我认为这是正确的答案。 exe 是一个程序集,它恰好有一个入口点。
    • 我可能弄错了,但是您不能简单地将可执行文件的扩展名重命名为 dll 并让客户端不明智吗?然后它会“看起来”像一个 dll,但有一个入口点(尽管入口点会立即返回)。
    【解决方案4】:

    我不太确定为什么人们认为这是不可能的,但实际上是。

    最简单的方法是将exe 重命名为dll 听起来很愚蠢,我知道。但它在许多情况下都有效。此外,正如“Peter I”所说,.NET exe 可以作为程序集导入其他项目中。所以你可能实际上并不需要 dll。

    另一种方法是使用C# command line,如此处所述:/out (C# Compiler Options)

    您可以在 Pre/Post 构建事件中使用命令行选项Pre-build Event/Post-build Event Command Line Dialog Box

    【讨论】:

      【解决方案5】:

      您应该将您的项目编译为 dll,然后在控制台应用程序中使用此 dll。

      实现您想要的一种可能性是在项目的构建后事件上手动运行 msbuild。

      见:How do i build a solution programatically in C#?

      Building C# Solution in Release mode using MsBuild.exe

      【讨论】:

        【解决方案6】:

        控制台应用程序是您项目的类型。你不能改变它。

        您可以而且必须做的是,将您的逻辑带入一个类库项目,并从您想要的任何类型的项目中使用您的类库。

        【讨论】:

        • 当然可以。只需查看选项卡Application 下的解决方案设置即可。输出类型有一个组合框。
        • @Smartis,奇怪的是我从来没有注意到它。也许是因为我从来不需要它。为什么你需要这样的功能?为什么要决定在构建期间获取什么(dll 或 exe)?如果我知道的话,也许我可以帮忙。顺便说一句,虽然彼得一世的解决方案会起作用,但最好将逻辑和用户界面分离到不同的项目中。
        【解决方案7】:

        据我所知,编译后不可能更改输出类型。话虽如此,如果您的解决方案中可能有 两个 项目,例如 ConsoleLibrary,它们将使用相同的源代码文件,但有不同的输出类型。这样一来,您将获得不同的输出,而无需任何重复的代码。

        【讨论】:

        • Codor 和 Doruk 是对的。在您的解决方案中添加一个类库项目,并将几乎所有内容都放在那里。您的控制台项目只会调用 dll。
        • 同意 - 重构以将控制台应用程序中的通用代码引入到通用 DLL 中
        • 好的,我做到了。我的“控制台应用程序”作为 DLL 输出。如何获得 EXE?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 2013-05-13
        相关资源
        最近更新 更多