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

10

我在Visual Studio中有一个C#项目,输出类型为控制台应用程序

但是我还需要另一个解决方案的类库

现在我每次都要切换输出类型,但我想知道是否可以在同一生成事件中生成exedll

是否有后生成事件来实现此功能?


你有没有找到查找编译器选项的机会? - uTeisT
7个回答

12
据我所知,在编译后没有更改输出类型的可能性。话虽如此,如果您的解决方案中有类似“控制台”和“库”这样的两个项目,并且它们使用相同的源代码文件但具有不同的输出类型,那么这是可能的。这样一来,您就可以在没有任何代码重复的情况下获得不同的输出。

2
Codor和Doruk是正确的。在您的解决方案中添加一个类库项目,并将几乎所有内容放在其中。您的控制台项目只需调用dll即可。 - Olivier Citeau
1
同意 - 重构以将公共代码从控制台应用程序提取到公共 DLL 中。 - João Lourenço
好的,我已经完成了。我的“控制台应用程序”输出为DLL文件。如何获得EXE文件? - HackSlash

4
通常可以将.net exe程序集引用为类库,因此您可以创建一个exe文件并将其引用(听起来很奇怪,但是可行)到其他项目中。在浏览引用的对话框中,您可以选择exe文件,如下图所示:Browse for Reference Dialog但是,正如评论所述,这取决于您的使用情况。我不建议向客户提供带有入口点的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)
这样就可以清楚地告诉其他人有一个使用库以及这个库本身的应用程序。

1
虽然这样做可以工作,但不建议这样做,因为通常您不会将exe文件发送给客户。相反,一起打包或仅提供可消耗的dll文件。 - Rahul
1
我认为这是正确的答案。一个exe文件是一个恰好有入口点的汇编程序。 - stijn
我可能错了,但是你不仅可以将可执行文件的扩展名重命名为dll,而且客户端也不会察觉到。然后它就会像一个dll一样“看起来”,但有一个入口点(尽管该入口点立即返回)。 - KDecker

2

控制台应用程序是您项目的类型。您无法更改它。

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


1
当然可以。只需查看“应用程序”选项卡下的“解决方案设置”。那里有一个输出类型的组合框。 - Smartis
@Smartis,我从来没有注意到这一点,可能是因为我从来没有需要它。你为什么需要这样的功能?为什么在构建过程中要决定获取(dll或exe)?如果我知道的话,也许我可以帮忙。顺便说一句,虽然Peter I的解决方案可行,但最好将逻辑和UI分开成不同的项目。 - Doruk

2

2
通常的解决方案是使用两个项目的解决方案:
  • 一个类库包含所有代码(构建成DLL)
  • 一个控制台应用程序引用该库,其Main只调用一些函数。
有关更多信息,请查看MSDN Solutions页面
Codor建议手动将文件添加到控制台项目中,但一个缺点是构建设置不在两个版本之间共享,因此可能会出现一些不一致。

这是我正在做的事情,我的解决方案将“控制台应用程序”编译成DLL。我无法使其输出EXE。您提供的链接没有帮助。 - HackSlash
@HackSlash,提出一个新问题,并提供足够的设置细节,以便我们可以帮助您! - Kroltan
我的问题出在 .net core 上。它的工作方式并不像你期望的那样。我不建议在控制台应用程序中使用它。 - HackSlash

0

我有一个类似的需求,在这篇文章或其他地方都找不到明确的答案。我目前有一个类库,想创建一个控制台应用程序项目,而不复制任何代码。理想情况下应该有两个项目,一个用于创建控制台应用程序,另一个用于创建类库。这也是Visual Studio建议的做法。当我尝试运行类库时,我得到了以下消息。

enter image description here

这明显要求我们向解决方案中添加可执行项目,并将库项目添加为引用。

以下是操作步骤:

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

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

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

就是这样。 Bingo!

另外,正如其他答案中提到的那样,不可能有相同的项目生成 .exe 和 .dll。但是您可以通过拥有两个项目来使同一个解决方案生成这两个文件。这样,每次切换项目输出时都不需要进行任何更改。

顺便提一下,我使用的是Visual Studio 2017.


0

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接