【问题标题】:How to do exe file no root directory?exe文件没有根目录怎么办?
【发布时间】:2019-12-30 13:12:59
【问题描述】:

默认情况下,构建路径\debug\x86\

db (folder)
log (folder)
*.exe
*.pdb
*.config

我想将 *.exe(pdb 和配置)移动到我的文件夹 bin (\debug\x86\bin)

我做下一篇构建脚本

ROBOCOPY "$(TargetDir) " "$(TargetDir)bin\ " *.exe *.config *.pdb /IS /MOVE

但是当我运行应用程序时崩溃(或 start 由 Visual Studio)

该项目包含其他文件夹。所以我想把文件放在不同的文件夹中。

我想要这个结构

db (folder)
log (folder)
bin (folder)

【问题讨论】:

    标签: c# visual-studio build msbuild


    【解决方案1】:

    关于为什么 VS 抛出该错误消息而您无法启动程序 在 VS 中:

    对于 VS 中的 C# 项目,它有默认的Output path,就像上面 Larry 建议的那样,当我们尝试简单地启动或调试程序时,VS 将调用输出 xx.exe根据TargetDir。由于您使用构建后事件将输出 xx.exe 从 $(TargetDir) 移动到 $(TargetDir)bin,因此每次 VS 尝试启动程序时,它都不会找到程序,因为它实际上不在 $(TargetDir)路径。

    注意:$(OutputPath)$(TargetDir) 在 msbuild 构建时指的是同一路径。

    我想将 *.exe(pdb 和配置)移动到我的文件夹 bin (\debug\x86\bin)

    对于 VS 中的 C# 项目,不建议这样做。我假设您当前项目中可能有 log 和 db 文件夹,如果其中的文件设置为 Content build action 和 CopyAlways 或 CopyIfNever,那么无论您设置什么输出路径,输出结构都是这样的:

    无需在当前路径创建新的 bin 文件夹并将*.exe, *.pdb, *.config 移动到其中。它会影响 VS 中的正常调试行为,如果 xx.exe 依赖于 db 文件夹中的数据库,也可能会导致未知错误。 (更改路径后,xx.exe可能会尝试在错误路径中搜索)

    不确定你用的是什么VS版本,可以查看this issueMsbuild 是 VS 中的构建引擎,vs 用它来构建 C# 项目。您可以在您的机器中找到它的路径并检查其典型结构:

     --Msbuild.exe
    |
     --necessary files
    |
     --referenced assemblies
    |
     --other folders
    

    总而言之,使用构建后脚本会调用崩溃导致 VS 找不到 xx.exe。并且没有有效的方法来获得您想要的结构,因为原始结构是 VS 对于 C# 项目的预期行为。所以也许我们可以让它在正常情况下它应该是。

    更新:

    如果我现在想发布程序。当然,现在我以发布模式构建程序。输出结构为:

    RootDir(name:xxx) ---xx.exe
                      ---xx.config
                      ---log folder
                         ---log file
                      ---text folder
                         ---txt file
                      ---db folder
                         ---db file
    

    根据您的要求,为什么不创建一个新的 bin 文件夹并将 xx.exe、xx.config 放入其中。然后重命名根文件夹的名称,手动更改为:

    ProgramName ---bin folder
                   ---xx.exe
                   ---xx.config
                   ---other referenced assemblies
                ---log folder
                   ---log file
                ---text folder
                   ---txt file
                ---db folder
                    ---db file
    

    您需要注意的是确保您的程序可以找到所需的文件,例如this。由于您可能通过代码依赖这些文件,因此一个简单的示例使用这种格式的路径:@"..\text\test.txt".. 表示上述目录。所以如果你使用@"..\db\database file"这样的语句,你的程序可以找到必要的文件。

    但请注意,这种方式会影响 noraml 调试行为,因此在调试时请保持所有正常结构。并在尝试释放时使用特殊结构。

    【讨论】:

    • 谢谢,我明白为什么我会收到来自 VS 的错误。您能否澄清其他开发人员为隐藏 .exe 文件所做的常见操作,该文件位于不在根目录中的文件夹中。他们如何计算到其他文件夹的路径?
    • @Viewed 在开发和调试时需要将 .exe 隐藏在文件夹中的特殊原因是什么?我认为你只需要在你想发布或分享给其他人时这样做。如果是这样,您可以简单地手动移动结构以获得您想要的。只需确保您的 .exe 可以找到所需的文件。
    • @Viewed 如果您正在考虑如何以您预期的结构部署程序,您可以查看我的更新。但是如果你正在调试你的程序,这意味着只有你可以访问 .exe,如果我们保留它的正常结构可能会更好。
    【解决方案2】:

    不要使用ROBOCOPY,而是更改项目的实际构建位置。

    转到Project -> Properties -> Build并将输出路径更改为/Debug/x86/bin

    这应该可以正确调试。

    VS Docs on Output Path

    【讨论】:

    • 这会将所有文件移动到 bin 文件夹中。我想在根文件夹中有 bin log db。
    • 我很困惑,这只会移动构建的文件(例如 .exe 和 .DLL 文件),而不是已经存在的文件夹。
    • 所以“已经存在”是从项目中复制出来的。所以它都会进入 bin。
    • “log”和“db”是用 VS 构建的,还是构建前/后构建步骤?因为如果它们没有被构建,它们只会停留在 Debug 中。
    • 日志和数据库是从项目中复制的(每次构建期间)
    猜你喜欢
    • 2020-04-02
    • 2021-04-20
    • 1970-01-01
    • 2013-10-22
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多