代码之家  ›  专栏  ›  技术社区  ›  Mark Ingram

如何为不同的配置使用不同的程序集名称?

  •  10
  • Mark Ingram  · 技术社区  · 16 年前

    在Visual Studio 2008(及其他)中,当创建.NET或Silverlight应用程序时,如果查看项目属性,似乎在所有配置中只能有一个程序集名称。我想将我的应用程序编译为:

    MyAppDebug-处于调试模式 而且只是 myapp-处于发布模式

    有人知道这是否可行吗?

    编辑:

    似乎有些人在质疑问题背后的推理,所以我将进一步解释:

    我正在开发一个Silverlight应用程序,当我进入“构建解决方案”时,它会自动上传到我们的测试站点。问题是,测试团队现在正在测试在线版本,而我正在开发一个新版本。所以,我希望有一个类似于\myapp.html的URL,用于QA团队将测试的常规版本,然后是\myapp.html?version=debug当前正在使用的版本。

    4 回复  |  直到 15 年前
        1
  •  11
  •   Roman Starkov    15 年前

    我通过处理.csproj文件来完成这项工作:要么将属性移动到特定于配置的属性组中,要么只使用条件。例子:

    <AssemblyName>MyApp</AssemblyName>
    <AssemblyName Condition=" '$(Configuration)' == 'Debug' ">MyAppDebug</AssemblyName>
    

    当您开始像这样处理.csproj时,Visual Studio会变得有些残废-例如,我不能再使用f5/f10在调试模式下运行项目;它告诉我找不到“myapp.exe”(即,调试器尝试使用错误的assemblyname启动程序集)。

        2
  •  3
  •   nruessmann    16 年前

    确实可以添加后期生成事件来重命名程序集。如果您的解决方案只有一个程序集,这将起作用。

    但是,如果您的解决方案由多个项目组成,那么通常会有一个项目引用由另一个问题生成的程序集。假设您的解决方案有两个项目:第一个项目创建Windows窗体exe(myapp.exe),它引用由第二个项目(mydata.dll)创建的程序集。

    在此示例中,调试exe将命名为myappdebug.exe,它需要引用mydatadebug.exe。这对于在后期生成事件中重命名也不起作用。

    因此,我强烈建议不要进行任何重命名。

        3
  •  2
  •   Josh    16 年前

    如果您完全有信心这样做,那么您可以在assemblyinfo.cs文件中这样做:

    #if DEBUG
    [assembly: AssemblyTitle("MyAssemblyDebug")]
    #else
    [assembly: AssemblyTitle("MyAssembly")]
    #endif
    

    然而,这几乎是一个黑客。此外,msdn文档非常清楚,在加载程序集时甚至不考虑文件名,因此进行简单重命名不会更改程序集的整体标识。

    如上所述,这通常是一个坏主意,因为它只会带来混乱和维护问题。如果只需执行生成后操作重命名文件:

    重命名 “$(projectdir)bin\debug\someassembly.dll” someassemblydebug.dll文件

    然后,您还没有真正更改程序集的标识,只更改了文件名。您可以将其命名为bob.dll,并且对于clr,它仍然具有相同的标识。唯一重要的时间是,当您使用将部署到GAC的强名称程序集时。在这种情况下,你 不能 文件名与程序集名不同。

    如果您真的要重命名程序集名称,而不仅仅是文件名,那么您手上还有另一个问题,因为它现在与CLR是完全不同的程序集。

    我认为你最好遵守现有的标准。如果你发现自己不得不做一些非常奇怪的事情,也许你应该问问自己为什么你要这么做。可能有更好的解决方案。

        4
  •  1
  •   Mark Ingram    16 年前

    我已经通过使用后期构建脚本实现了我所追求的目标:

    if "$(ConfigurationName)"=="Debug" goto debug
    "$(SolutionDir)ftp.bat" "$(TargetDir)$(TargetName).xap"
    :debug
    "$(SolutionDir)ftp.bat" "$(TargetDir)$(TargetName).xap" "$(TargetDir)$(TargetName)Debug.xap"
    

    我的ftp脚本在末尾基本上接受了一个可选参数,这就是上传文件的方式。因此,在我的本地计算机上,文件名总是相同的,但是在调试模式下,我们在文件名末尾用“debug”上载它。现在我可以在我的网页上选择要显示的版本。