【问题标题】:How can I create different DLLs in one project?如何在一个项目中创建不同的 DLL?
【发布时间】:2009-03-03 14:45:41
【问题描述】:

我有个问题不知道能不能解决。我在 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 名称?

【问题讨论】:

    标签: c# visual-studio c-preprocessor visual-studio-2005 assemblies


    【解决方案1】:

    这是一个样例 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,您有两种选择。

    程序集名称构建为follows:

    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 所知,这两个选项都会产生两个不同的程序集 - 因为它比较的是完整的程序集名称,而不是“简单”名称。

    【讨论】:

    • 您删除它然后重命名它?您不必删除它,只需重命名即可。还是我错过了什么? :-)
    • 可能是旧版本仍然存在。
    • 是的,重命名操作不会覆盖。您可以使用 move /y "$(TargetPath)" "$(TargetDir)ReleaseOutput.dll" 代替 del-rename 行 - 移动操作可以覆盖。
    • 这个脚本非常好,但不是我想要的。我试图将两个dll(一个和重命名的)都移到GAC,但它没有用。这是重命名 dll 的一个很好的解决方案,但不是最好的。
    • @jaloplo:查看编辑以了解如何让 GAC 看到两个不同的文件。
    【解决方案2】:

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

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

    <Target Name="AfterBuild">
        <Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
        <Delete Files="$(OutputPath)\YourAssembly.dll"/>
    </Target>
    

    【讨论】:

    • 嗨,Kent,我认为这是我的问题的解决方案,但 MSBuild 没有像 这样的命令。我写信给 Microsoft 的 Jay Shrestha,告诉我在 Visual Studio 中不可能做我想做的事。而不是这个,我必须使用“msbuild.exe”来构建项目。
    • Visual Studio 在每次构建后执行特定的 MSBuild 目标。只需编辑该目标并使用适当的 MSBuild 任务重命名文件。
    • 这部分配置对于VS 2005和VS 2008是一样的。这是.csproj文件的一部分。
    • 嗨,你能给我发一个网页来解释 Visual Studio 的 msbuild 命令吗?提前致谢!
    • 您可以从msdn.microsoft.com/en-us/library/7z253716.aspx 开始。请注意,您还可以编写自己的任务或下载任务库,例如:msbuildtasks.tigris.org
    【解决方案3】:

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

    <Target Name="BeforeBuild">
        <AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
        <AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
    </Target>
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-12-02
        • 1970-01-01
        相关资源
        最近更新 更多