3

有个问题不知道能不能解决。我在 Visual Studio 2005 上有一个 C# 项目,我想根据预处理器常量创建不同的 DLL 名称。我现在拥有的是预处理器常量、两个 snk 文件和两个程序集的 guid。我还创建了两个配置(调试和调试预处理器),它们使用适当的 snk 和 guid 完美编译。

#if PREPROCESSOR_CONSTANT
[assembly: AssemblyTitle("MyLibraryConstant")]
[assembly: AssemblyProduct("MyLibraryConstant")]
#else
[assembly: AssemblyTitle("MyLibrary")]
[assembly: AssemblyProduct("MyLibrary")]
#endif

现在,我必须将这两个程序集放入 GAC。添加第一个程序集没有问题,但第二个程序集没有。

如何从一个 Visual Studio 项目创建两个或多个不同的程序集?

我可能忘记在“AssemblyInfo.cs”中添加一个新行来根据预处理器常量更改 DLL 名称?

4

4 回答 4

4

这是一个示例 Post-Build 事件:

if "$(ConfigurationName)" == "Debug" goto Debug
if "$(ConfigurationName)" == "Release" goto Release

goto End

:Debug
del "$(TargetDir)DebugOutput.dll"
rename "$(TargetPath)" "DebugOutput.dll"

:Release
del "$(TargetDir)ReleaseOutput.dll"
rename "$(TargetPath)" "ReleaseOutput.dll"

:End

更改DebugOutput.dllReleaseOutput.dll到正确的文件名。您可以更改"Debug""Release"支持其他配置,并添加部分以支持更多配置。


该脚本将创建两个具有不同文件名的 dll;要创建两个不同的 AssemblyName,您有两个选择。

程序集名称构建如下

Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'

因此,您必须更改文化信息、版本或强名称。

两个最简单的选择是:

  1. 更改程序集版本:

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyVersion("1.0.0.0")]
    #else
    [assembly: AssemblyVersion("1.0.0.1")]
    #endif
    
  2. 更改密钥文件 - 使用该sn工具创建两个密钥文件,然后在AssemblyInfo.cs

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyKeyFile("FirstKey.snk")]
    #else
    [assembly: AssemblyKeyFile("SecondKey.snk")]
    #endif
    

据 GAC 所知,这两个选项都会导致两个不同的程序集 - 因为它比较的是完整的程序集名称,而不是“简单”名称。

于 2009-03-03T15:07:31.267 回答
3

Visual Studio 不允许按配置输出文件名。但是,您可以将输出文件重命名为构建脚本的一部分。您可以在您的 MSBuild 脚本中为相关的特定项目执行此操作。

例如,将其放在.csproj文件的末尾:

<Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
    <Delete Files="$(OutputPath)\YourAssembly.dll"/>
</Target>
于 2009-03-03T14:55:30.670 回答
1

我自己没有尝试过,所以把它当作一个友好的建议。尝试手动编辑您的 .csproj 添加或取消注释 BeforeBuild 目标,其中的灵感来自以下内容:

<Target Name="BeforeBuild">
    <AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
    <AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
</Target>
于 2009-03-03T15:22:45.287 回答
-1

我认为没有这样的方法。输出程序集名称严格固定在项目设置中:每个项目一个程序集。

此外,您给出的 AssemblyAttributes 仅指示可见的程序集属性(例如在 Windows 资源管理器中),而不是文件名。

于 2009-03-03T14:48:41.420 回答