【问题标题】:VB.NET: Can the .EXE built by VS2005 be deployed as a standalone EXE?VB.NET:VS2005构建的.EXE可以作为独立的EXE部署吗?
【发布时间】:2010-06-15 09:03:26
【问题描述】:

VB.NET:VS2005构建的.EXE能否部署为独立的EXE

当我将 VS2005 中的模式更改为“发布”并构建解决方案时,bin\Release 目录将包含解决方案.EXE 文件,还有一个.pdbvshost.exe.xml 文件。这些额外的文件是什么?它们是否必要?

我将.exe 文件复制到另一台机器上,它可以正常执行,但在第一次执行时出现了明显的延迟 - 此后它就像任何其他程序一样。这是什么原因,可以帮忙吗?是不是因为Release文件夹里的其他3个文件都没有?

【问题讨论】:

    标签: vb.net deployment


    【解决方案1】:

    您用于启动项目的项目模板没有非常优化的设置。结果,您会感到混乱。它很容易修复。从项目 + 属性,编译选项卡开始。确保选中 Release build,左上角的组合框标记为 Configuration。

    • .pdb 文件包含调试符号。发布版本不需要它,尽管您会收到更多信息的异常消息。堆栈跟踪将包含行号。但是,您不能信任他们进行发布版本。点击高级编译选项,生成调试信息=无。

    • .xml 文件包含 IntelliSense 信息,它将在您在源代码中使用 XML 文档时生成。用于在另一个项目中引用的程序集,对于 EXE 项目毫无意义。关闭“编译”选项卡上的“生成 XML 文档文件”选项。

    • .vshost.exe 文件是用于调试应用程序的帮助进程。它托管 CLR 的自定义版本,配置不同以帮助解决调试时的安全问题。它还使 Console.WriteLine() 的输出出现在 Visual Studio 输出窗口中。为发布版本创建它没有什么意义。选择“调试”选项卡并取消选中“启用 Visual Studio 托管进程”选项。

    进行这些更改并重建后,您应该只将 .exe 文件留在 bin\Release 文件夹中。

    慢启动是所谓的 .NET 框架程序集的“冷启动”。它是由缓慢或碎片化的硬盘驱动器引起的。由于以前从未加载过 DLL,因此磁盘驱动器需要通过 GAC 挖掘来查找文件。您可能可以通过对磁盘进行碎片整理来改进它。不过,冷启动永远不会像热启动那样快。

    Microsoft Office 和 Adob​​e Acrobat 使用的一个经典技巧是通过在登录时加载它们的 DLL 来预热文件系统缓存。它们在 Startup 文件夹或 Run 注册表项中称为“优化器”。顺便说一句,它们很烦人,它们会减慢其他程序的速度。您可以通过编写自己的小 .NET 程序来做同样的事情,该程序除了创建一些类之外什么都不做。将它的快捷方式放在 Startup 文件夹中。

    【讨论】:

    • 但我的 .net 应用程序非常小。它只是读入一个文本文件,进行更改,然后写回文件。它不需要加载许多.net 类。 NGEN 会有帮助吗?
    • 您的应用程序很小,但 .NET 不是。是的,ngen 可以帮助热启动时间,但它对冷启动时间影响不大。不建议将 ngen 用于小型应用程序。在 superuser.com 上询问改善冷启动的方法,您听起来并不相信这是一个硬盘问题。
    【解决方案2】:

    您应该可以只发送 EXE。 PDB 和 VSHOST 文件用于调试,您应该能够将您的 Release 构建配置为不生成这些文件。您可以在项目属性的“编译”选项卡的“高级编译器设置”对话框中进行设置。 alt text http://philippursglove.com/stackoverflow/compilerdebugoptions.png (向 Amissisco 致敬,指出它与 VS2005/2008 中的对话框相同。)

    我想您第一次运行程序时遇到的“显着延迟”是由于 .NET Framework 被加载到内存中(然后可能又被分页到磁盘) - 不幸的是,没有太多的解决办法那个。您可以尝试将硬件投入其中 - 内存和固态磁盘可能会显着提高速度,但如果您的应用程序要在大量 PC 上发布,则可能不是一个具有成本效益的选择。但是,这应该只发生在您在机器重新启动后第一次启动应用程序时,这就是为什么后续启动应用程序会更快的原因。

    【讨论】:

    • VS2008 配置相同。
    • .NET 框架多久需要加载到内存中?每个 Windows 会话一次?
    • .NET 框架是否可以由另一个应用程序启动加载,从而导致其他 .NET 应用程序的首次运行更快,或者每个 .NET 应用程序的首次运行都会出现这种延迟?
    • @Craig 是的 - 框架本身应该只需要在每个会话中加载一次。
    【解决方案3】:

    部署只需要 .Exe 文件。但最好创建一个设置。如果您使用的是 App.Config 文件/应用程序设置,您也需要复制 exename.config 文件。

    【讨论】:

    • 安装了错误的.NET框架或者根本没有安装.NET框架会怎样?
    • @Craig Johnston:如果您正在创建一个安装程序,那么会有先决条件,因此该安装程序将检查 .Net Framework 或任何其他依赖项。
    【解决方案4】:

    是的,您可以将它与任何不属于 .NET Framework 的第三方 DLL 以及其他资源(例如 application.config)一起部署为独立的 EXE。图片和/或其他媒体资产。

    .pdb 包含附加的符号调试信息,这些信息对于您的应用程序运行来说是不必要的。它旨在帮助调试,以便您在调试器中看到源代码而不是汇编代码。

    vshost.exe 仅供 Visual Studio 使用,但不太确定它的确切用途。

    这三个文件(.pdb、vshost.exe 和 .xml)是否与 .exe 一起存在不应影响应用程序的加载速度。由于 .NET 应用程序必须在首次运行时进行编译,因此您遇到的延迟应该是部分原因。

    【讨论】:

    • @Roys:有什么方法可以加快第一次运行,因为如果我部署一个小型实用程序或工具,我发现它特别慢且不可接受。
    • 嗯,克劳迪奥·卡尔达托在 MSDN 杂志@msdn.microsoft.com/en-us/magazine/cc163655.aspxmsdn.microsoft.com/en-us/magazine/cc337892.aspx 上有两篇文章。不得不承认,我以前从未尝试过优化我的 .NET 应用程序的启动时间 - 使用初始屏幕来表示应用程序正在加载。
    • @roys:我通常不会关心启动时的短暂延迟,但当它只是一个非常小的工具或实用程序时,我认为延迟是不可接受的。
    • 那么请参阅第一篇文章中的提示。虽然它是在 2006 年编写的,但诸如避免不必要的初始化和在启动时加载更少的模块之类的东西应该仍然适用。也提到了 NGEN,但我还没有尝试过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多