构建与控制台和 DLL 相同的项目

Build same Project as Console and DLL

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

但我还需要这个项目的 Class Library 作为另一个解决方案。

现在我每次都要切换输出类型,但我想知道是否可以同时生成exedllbuild-event?

这个有post-build-event吗?

据我所知,编译后无法更改输出类型。也就是说,如果可以在您的解决方案中包含 两个 项目,例如 ConsoleLibrary,它将使用相同的源代码文件但具有不同的输出类型。这样你就可以在没有任何重复代码的情况下获得不同的输出。

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

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

通常可以引用 .net exe 程序集,因为它是一个 class-库。

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

这是浏览参考的对话框。如您所见,您可以 select 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 和一个已发布的 class 库,我会像这样重构你的解决方案:

  • (A) 完成申请 (.sln)
    • (B) 控制台应用程序 (.csproj) 引用了 (C)
    • (C) class 库项目 (.csproj)

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

您应该将您的项目编译成一个 dll,然后在控制台应用程序中使用这个 dll。

实现您想要的目标的一种可能性是在项目的 post-build 事件中手动 运行 msbuild。

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

Building C# Solution in Release mode using MsBuild.exe

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

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

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

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

通常的解决方案是使用包含两个项目的解决方案:

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

有关详细信息,请查看 MSDN page on Solutions

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

我也有类似的需求,在这个 post 或任何地方都找不到任何明确的答案。我目前有一个 class 库,想在不复制任何代码的情况下创建一个控制台应用程序项目。理想情况下应该有两个项目,一个用于创建控制台应用程序,另一个用于创建 class 库。这就是 visual studio 也暗示的内容。当我尝试 运行 class 库时,我收到以下消息。

它明确要求我们向解决方案添加一个可执行项目,并添加对库项目的引用。

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

Right click solution -> Add new project -> Console App -> choose name -> ok.

Right click on the console project -> add reference -> In reference manager, click on the projects tab and select the other project(In my case this is the class library project, In case it is not listed just click on browse and select the .csproj file) -> ok.

现在要在其他项目中使用 classes,只需执行 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