【问题标题】:How to use a different assembly name for different configurations?如何为不同的配置使用不同的程序集名称?
【发布时间】:2010-04-05 06:39:56
【问题描述】:

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

MyAppDebug - 处于调试模式 并且只是 MyApp - 处于发布模式

有谁知道这是否可行?

编辑:

似乎有人质疑这个问题背后的原因,所以我将进一步解释一下:

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

【问题讨论】:

    标签: .net visual-studio-2008


    【解决方案1】:

    我通过弄乱 .csproj 文件来做到这一点:要么将属性移动到特定于配置的属性组中,要么只使用 Condition。示例:

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

    当您像这样开始弄乱 .csproj 时,Visual Studio 会变得有些瘫痪 - 例如,我不能再按 F5/F10 在调试模式下运行项目;它告诉我找不到“MyApp.exe”(即调试器尝试使用错误的 AssemblyName 启动程序集)。

    【讨论】:

    • 未经测试,但我认为如果您将第一行设置为与第二行相反的条件,您的调试问题可能会消失。当 Visual Studio 找到第一个有效的 AssemblyName 时,它​​可能会停止解析。
    • 我已经测试了 CAD 家伙的假设,它是完全正确的。切换顺序(或更一般地说,首先放置任何条件语句)将修复“MyApp.exe”未找到错误。一旦 Visual Studio 找到一个有效的 AssemblyName,它就会忽略后面的任何内容。
    【解决方案2】:

    当然,您可以添加构建后事件来重命名程序集。如果您的解决方案只有一个程序集,这将起作用。

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

    在此示例中,调试 EXE 将命名为 MyAppDebug.EXE,并且它需要引用 MyDataDebug.EXE。这不适用于构建后事件中的重命名。

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

    【讨论】:

    • 构建后重命名还有另一个问题:您失去了很多调试器集成。你基本上必须自己运行程序,然后附加调试器。
    【解决方案3】:

    如果您绝对决心这样做,那么您可以在您的 AssemblyInfo.cs 文件中执行类似的操作:

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

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

    如上所述,这通常不是一个好主意,因为它只会带来混乱和维护问题。如果您所做的只是通过执行构建后操作重命名文件:

    重命名 “$(ProjectDir)bin\Debug\SomeAssembly.dll” SomeAssemblyDebug.dll

    那么你并没有真正改变你的程序集的身份,只是改变了文件名。您可以将其命名为 Bob.dll,就 CLR 而言,它仍然具有相同的标识。唯一重要的是当您使用将部署到 GAC 的强命名程序集时。在这种情况下,您不能使用与程序集名称不同的文件名。

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

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

    【讨论】:

      【解决方案4】:

      通过使用构建后脚本,我设法实现了我所追求的目标:

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

      我的 ftp 脚本最后基本上接受一个可选参数,即上传文件的内容。所以在我的本地机器上,文件名总是相同的,但是在调试模式下,我们在文件名末尾加上“调试”来上传它。现在我可以在我的网页中选择要显示的版本。

      【讨论】:

      • 为什么不使用不同的文件夹呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 2011-09-26
      相关资源
      最近更新 更多