3

解決できるかどうかわからない質問があります。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 つ以上の異なるアセンブリを作成するにはどうすればよいですか?

プリプロセッサ定数に応じて DLL 名を変更するために、「AssemblyInfo.cs」に新しい行を含めるのを忘れた可能性がありますか?

4

4 に答える 4

4

ビルド後のイベントの例を次に示します。

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"て他の構成をサポートしたり、セクションを追加してより多くの構成をサポートしたりできます。


このスクリプトは、ファイル名が異なる 2 つの dll を作成します。2 つの異なる AssemblyName を作成するには、2 つのオプションがあります。

アセンブリ名はのように構築されます。

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

したがって、カルチャ情報、バージョン、または厳密な名前を変更する必要があります。

最も単純な 2 つのオプションは次のとおりです。

  1. アセンブリ バージョンを変更します。

    #if SOME_COMPILER_SYMBOL
    [assembly: AssemblyVersion("1.0.0.0")]
    #else
    [assembly: AssemblyVersion("1.0.0.1")]
    #endif
    
  2. snキーファイルを変更します -ツールを使用して 2 つのキーファイルを作成しますAssemblyInfo.cs

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

これらのオプションは両方とも、GAC が認識する限り、2 つの異なるアセンブリになります。これは、「単純な」名前ではなく完全なアセンブリ名を比較するためです。

于 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

そんな方法は無いと思います。出力アセンブリ名はプロジェクト設定に厳密に固定されています: 1 つのプロジェクトにつき 1 つのアセンブリです。

また、指定した AssemblyAttributes は、ファイル名ではなく、表示されるアセンブリ プロパティ (Windows エクスプローラーなど) のみを示します。

于 2009-03-03T14:48:41.420 に答える