如何在一个项目中创建不同的DLL?
-
03-07-2019 - |
题
我有一个问题我不知道是否可以解决。我在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名称?
解决方案
以下是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.dll
和 ReleaseOutput.dll
更改为正确的文件名。您可以更改" Debug"
和" Release"
以支持其他配置,并添加部分以支持更多配置。
该脚本将创建两个具有不同文件名的dll;要创建两个不同的AssemblyNames,您有两个选择。
程序集名称构建为关注 :
Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'
因此,您必须更改文化信息,版本或强名称。
两个最简单的选项是:
-
更改装配版本:
#if SOME_COMPILER_SYMBOL [assembly: AssemblyVersion("1.0.0.0")] #else [assembly: AssemblyVersion("1.0.0.1")] #endif
-
更改密钥文件 - 使用
sn
工具创建两个密钥文件,并在AssemblyInfo.cs
中创建:#if SOME_COMPILER_SYMBOL [assembly: AssemblyKeyFile("FirstKey.snk")] #else [assembly: AssemblyKeyFile("SecondKey.snk")] #endif
醇>
就GAC所知,这两个选项都会产生两个不同的程序集 - 因为它比较了完整的程序集名称,而不是'简单'名称。
其他提示
Visual Studio不允许按配置输出文件名。但是,您可以将输出文件重命名为构建脚本的一部分。您可以在MSBuild脚本中为相关项目执行此操作。
例如,将其放在 .csproj 文件的末尾:
<Target Name="AfterBuild">
<Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
<Delete Files="$(OutputPath)\YourAssembly.dll"/>
</Target>
我自己没有试过这个,所以把它作为一个友好的建议。尝试手动编辑.csproj添加或取消注释BeforeBuild目标,其中包含以下内容的剪辑:
<Target Name="BeforeBuild">
<AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
<AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
</Target>
我认为没有这样的方式。输出程序集名称严格固定在项目设置中:每个项目一个程序集。
您给出的AssemblyAttributes仅指示可见的程序集属性(例如在Windows资源管理器中),而不是它的文件名。