How can I create different DLLs in one project?
-
03-07-2019 - |
Question
I have a question I don't know if it can be solved. I have one C# project on Visual Studio 2005 and I want to create different DLL names depending on a preprocessor constant. What I have in this moment is the preprocessor constant, two snk files and two assembly's guid. I also create two configurations (Debug and Debug Preprocessor) and they compile perfectly using the snk and guid appropriate.
#if PREPROCESSOR_CONSTANT
[assembly: AssemblyTitle("MyLibraryConstant")]
[assembly: AssemblyProduct("MyLibraryConstant")]
#else
[assembly: AssemblyTitle("MyLibrary")]
[assembly: AssemblyProduct("MyLibrary")]
#endif
Now, I have to put the two assemblies into the GAC. The first assembly is added without problems but the second isn't.
What can I do to create two or more different assemblies from one Visual Studio project?
It's possible that I forgot to include a new line on "AssemblyInfo.cs" to change the DLL name depending on the preprocessor constant?
Solution
Here is a sample Post-Build event:
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
Change DebugOutput.dll
and ReleaseOutput.dll
to the proper filenames. you can change "Debug"
and "Release"
to support other configurations, and add sections to support more configurations.
That script will create two dlls with different file names; to create two different AssemblyNames, you have two options.
The assembly name is built as follows:
Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'
So you have to either change the culture info, the version or the strong name.
The two simplest options are:
Change the assembly version:
#if SOME_COMPILER_SYMBOL [assembly: AssemblyVersion("1.0.0.0")] #else [assembly: AssemblyVersion("1.0.0.1")] #endif
Change the keyfile - create two keyfiles with the
sn
tool, and inAssemblyInfo.cs
:#if SOME_COMPILER_SYMBOL [assembly: AssemblyKeyFile("FirstKey.snk")] #else [assembly: AssemblyKeyFile("SecondKey.snk")] #endif
Both these options will result in two different assemblies as far as the GAC knows - since it compares the full assembly name, and not the 'simple' name.
OTHER TIPS
Visual Studio does not allow per-configuration output filenames. However, you could rename the output file as part of your build script. You could do this in your MSBuild script for the particular project in question.
For example, put this at the end of your .csproj file:
<Target Name="AfterBuild">
<Copy SourceFiles="$(OutputPath)\YourAssembly.dll" DestinationFiles="$(OutputPath)\YourAssemblyRenamed.dll"/>
<Delete Files="$(OutputPath)\YourAssembly.dll"/>
</Target>
I havn't tried this myself so take it as a friendly suggestion. Try manually editing your .csproj adding or uncommenting the BeforeBuild target with a snipped inspired from the following:
<Target Name="BeforeBuild">
<AssemblyName Condition="'$(Configuration)' == 'Release'">MyReleaseName</AssemblyName>
<AssemblyName Condition="'$(Configuration)' == 'Debug'">MyDebugName</AssemblyName>
</Target>
I thinks there is no such way. Output assembly name is strictly fixed into Project settings: one assembly per one projects.
Also AssemblyAttributes you given only indicates visible assembly properties (for example in Windows Explorer), not it's file name.