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

C# 构建与控制台和DLL相同的项目,c#,visual-studio,post-build-event,C#,Visual Studio,Post Build Event,我在VisualStudio中有一个C#项目,它的输出类型是控制台应用程序 但是我还需要这个项目的类库作为另一个解决方案 现在我每次都必须切换输出类型,但我想知道是否有可能在同一个构建事件中生成exe和dll 是否有此的生成后事件 据我所知,编译后不可能更改输出类型。也就是说,如果您的解决方案中有两个项目(如Console和Library)是可能的,它们将使用相同的源代码文件,但具有不同的输出类型。这样,您将有不同的输出,而不会有任何代码重复。控制台应用程序就是您的项目类型。你不能改变它 您可以

我在VisualStudio中有一个C#项目,它的输出类型是
控制台应用程序

但是我还需要这个项目的
类库
作为另一个解决方案

现在我每次都必须切换输出类型,但我想知道是否有可能在同一个
构建事件中生成
exe
dll


是否有此的
生成后事件

据我所知,编译后不可能更改输出类型。也就是说,如果您的解决方案中有两个项目(如Console和Library)是可能的,它们将使用相同的源代码文件,但具有不同的输出类型。这样,您将有不同的输出,而不会有任何代码重复。

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


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

通常可以引用.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) 控制台应用程序(.csproj),其中引用了(C)
    • (C) 类库项目(.csproj)

因此,其他人非常清楚,有一个应用程序使用库和库本身。

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

实现所需功能的一种可能性是在项目的生成后事件上手动运行msbuild

见:


或者

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

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

另一种方法是使用
C#命令行
,如下所述:


您可以在生成前/生成后事件中使用命令行选项

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

  • 包含所有代码的类库(构建到DLL中)
  • 引用其
    Main
    的库的控制台应用程序只调用一些函数
有关更多信息,请查看


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

我有类似的要求,在本文或任何地方都找不到任何明确的答案。我目前有一个类库,希望在不复制任何代码的情况下创建一个控制台应用程序项目。理想情况下,应该有两个项目,一个用于创建控制台应用程序,另一个用于创建类库。这也是VisualStudio的建议。当我试图运行类库时,我得到了下面的消息

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

下面是执行此操作的步骤

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

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

现在要在另一个项目中使用这些类,请使用LibraryProjectNameSpace执行简单的do

我们到了。宾果

正如其他答案中提到的,不可能让同一个项目同时生成.exe和.dll。但是你可以用同样的解决方案,通过两个项目来产生这两个人。这样就不需要每次都切换项目的输出


仅供参考,我使用visual studio 2017

当然可以。只需查看选项卡
应用程序
下的解决方案设置。输出类型有一个组合框。@Smartis,奇怪的是我从来没有注意到它。也许是因为我从来都不需要它。为什么您需要这样的功能?为什么要决定在生成过程中获取什么(dll或exe)?如果我知道的话,也许我能帮上忙。顺便说一句,虽然Peter I的解决方案会起作用,但最好将逻辑和ui分离到不同的项目中。Codor和Doruk是对的。在您的解决方案中添加一个类库项目,并将几乎所有内容都放在那里。控制台项目只需调用dll.Agreed-refactor,将控制台应用程序中的公共代码转换成一个公共DLLOk,我做到了。我的“控制台应用程序”作为DLL输出。如何获取EXE?虽然可以,但不建议使用,因为一般情况下,您不会将EXE发送给客户端。我认为这是正确的答案。exe是一个恰好有入口点的程序集。我可能弄错了,但是你不能简单地将可执行文件的扩展名重命名为dll,让客户端不知道吗?然后,它将只是“看起来”像一个dll,但有一个入口点(尽管入口点只是返回imme)