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

时间:2008-10-16 10:51:55

标签: .net visual-studio-2008

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

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

有人知道这是否可行?

修改

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

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

4 个答案:

答案 0 :(得分:13)

我通过弄乱.csproj文件来完成此操作:将属性移动到特定于配置的属性组中,或者只使用Condition。例如:

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

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

答案 1 :(得分:3)

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

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

在此示例中,调试EXE将命名为MyAppDebug.EXE,并且需要引用MyDataDebug.EXE。这在后期构建事件中重命名时无效。

因此我强烈建议不要重命名。

答案 2 :(得分:2)

如果您完全放心,那么您可以在AssemblyInfo.cs文件中执行以下操作:

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

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

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

  

重命名   “$(PROJECTDIR)斌\调试\ SomeAssembly.dll”   SomeAssemblyDebug.dll

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

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

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

答案 3 :(得分:1)

我通过使用后期构建脚本设法实现了我的目标:

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

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