1つのプロジェクトで異なるDLLを作成するにはどうすればよいですか?
-
03-07-2019 - |
質問
解決できるかどうかわからない質問があります。 Visual Studio 2005に1つのC#プロジェクトがあり、プリプロセッサ定数に応じて異なるDLL名を作成したい。この時点で私が持っているのは、プリプロセッサ定数、2つのsnkファイル、2つのアセンブリのGUIDです。また、2つの構成(デバッグおよびデバッグプリプロセッサ)を作成し、適切なsnkおよびguidを使用して完全にコンパイルします。
#if PREPROCESSOR_CONSTANT
[assembly: AssemblyTitle("MyLibraryConstant")]
[assembly: AssemblyProduct("MyLibraryConstant")]
#else
[assembly: AssemblyTitle("MyLibrary")]
[assembly: AssemblyProduct("MyLibrary")]
#endif
ここで、2つのアセンブリをGACに配置する必要があります。最初のアセンブリは問題なく追加されますが、2番目のアセンブリは問題なく追加されます。
1つのVisual Studioプロジェクトから2つ以上の異なるアセンブリを作成するにはどうすればよいですか?
" AssemblyInfo.cs"に新しい行を含めるのを忘れた可能性があります。プリプロセッサ定数に応じてDLL名を変更するにはどうすればよいですか
解決
サンプルのビルド後イベントは次のとおりです。
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"
を変更して他の構成をサポートし、セクションを追加してより多くの構成をサポートできます。
このスクリプトは、異なるファイル名で2つのdllを作成します。 2つの異なるAssemblyNameを作成するには、2つのオプションがあります。
アセンブリ名は、フォローとして構築されます。 :
Name <,Culture = CultureInfo> <,Version = Major.Minor.Build.Revision> <, StrongName> <,PublicKeyToken> '\0'
したがって、カルチャ情報、バージョン、または厳密な名前を変更する必要があります。
最も簡単な2つのオプションは次のとおりです。
-
アセンブリバージョンの変更:
#if SOME_COMPILER_SYMBOL [assembly: AssemblyVersion("1.0.0.0")] #else [assembly: AssemblyVersion("1.0.0.1")] #endif
-
キーファイルの変更-
sn
ツールとAssemblyInfo.cs
で2つのキーファイルを作成します:#if SOME_COMPILER_SYMBOL [assembly: AssemblyKeyFile("FirstKey.snk")] #else [assembly: AssemblyKeyFile("SecondKey.snk")] #endif
これらのオプションは両方とも、GACが知る限り2つの異なるアセンブリになります-「単純な」名前ではなく完全なアセンブリ名を比較するためです。
他のヒント
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>
そのような方法はないと思います。出力アセンブリ名は厳密にプロジェクト設定に固定されています:1つのプロジェクトにつき1つのアセンブリ。
また、指定したAssemblyAttributesは、表示されるアセンブリプロパティ(Windowsエクスプローラーなど)のみを示し、ファイル名ではありません。