【问题标题】:how to produce a mix of dll and exe in one C# project in visual studio or other build tools?如何在 Visual Studio 或其他构建工具的一个 C# 项目中生成 dll 和 exe 的混合?
【发布时间】:2011-10-26 15:17:41
【问题描述】:

如何在 Visual Studio 或其他构建工具的一个 C# 项目中生成 dll 和 exe 的混合体? 技术上可行吗? 是的,我知道它可以在 2 个或更多项目中完成。

【问题讨论】:

  • 在单个项目中?不。你也不应该这样做!
  • 您为每个项目生成一个输出,并且您可以在一个解决方案中拥有多个项目 - 这就是您所追求的吗?
  • 是的,一个项目。一个项目可以有多个输出吗?

标签: c# .net exe class-library


【解决方案1】:

从技术上讲,exe 和 dll 的混合只是一个 exe。将它用作库没有什么问题,例如在其他项目中引用它。

首先我们需要明确“exe”和“dll”在本质上是相同的,但区别在于windows如何与它们交互。

当 windows 加载一个 dll 时,它会运行初始化代码,然后不理会它。如果应用程序显式引用了 dll 中的函数,则会调用它们。另一件事是,当 dll 崩溃时,它不仅会崩溃,还会导致应用程序崩溃,因为 dll 在父应用程序的内存中运行。

当 Windows 加载一个 exe 时,该 exe 的初始化代码负责创建所谓的“消息泵”,只不过是一个程序循环,只要应用程序运行,它就会运行。消息泵请求来自操作系统的消息。 Windows 将应用程序作为单独的任务进行跟踪。它为 exe 和使用该 exe 的应用程序分配单独的内存。每个exe运行的内存区域称为“进程空间”。

Dan Appleman - Developing ActiveX Components with Visual Basic 5.0

【讨论】:

  • 您从哪里复制了答案的引用部分?除了使用块引用语法之外,您还应该引用该来源。
  • 如果我引用 exe ,我可以直接调用它的 static void Main(string[]) 吗?
  • 当然。 Main() 是一个常规方法,就像您的应用程序中的任何其他方法一样。将其公开,将其容器类公开 - 然后就可以了。
【解决方案2】:

我不确定您提出问题的动机是什么,因为您可以像引用 dll 一样引用 .Net 可执行文件,但您可以考虑将 exe 文件复制到同名的 dll 文件中(是​​的这是一个 hack,但不确定你的动机)。

您可以为您的项目使用Visual Studio post-build event 自动执行此过程。这将在您每次成功构建时处理创建 dll 副本:

copy "$(TargetPath)" "$(TargetDir)$(TargetName).dll"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多