3

Ich habe eine Frage Ich weiß nicht, ob es gelöst werden kann. Ich habe ein C# -Projekt auf Visual Studio 2005 und ich möchte verschiedene DLL-Namen abhängig von einer Präprozessor-Konstante erstellen. Was ich in diesem Moment habe, ist die Preprozessor-Konstante, zwei Snk-Dateien und zwei Assembly-Guides. Ich erstelle auch zwei Konfigurationen (Debug und Debug Preprocessor) und sie kompilieren perfekt mit dem snk und guid entsprechenden.Wie kann ich verschiedene DLLs in einem Projekt erstellen?

#if PREPROCESSOR_CONSTANT 
[assembly: AssemblyTitle("MyLibraryConstant")] 
[assembly: AssemblyProduct("MyLibraryConstant")] 
#else 
[assembly: AssemblyTitle("MyLibrary")] 
[assembly: AssemblyProduct("MyLibrary")] 
#endif 

Jetzt muss ich die beiden Baugruppen in den GAC setzen. Die erste Baugruppe wird ohne Probleme hinzugefügt, die zweite nicht.

Was kann ich tun, um zwei oder mehr verschiedene Assemblies aus einem Visual Studio-Projekt zu erstellen?

Es ist möglich, dass ich vergessen habe, eine neue Zeile in "AssemblyInfo.cs" einzufügen, um den DLL-Namen abhängig von der Präprozessor-Konstante zu ändern?

Antwort

4

Hier ist ein Beispiel Post-Build-Ereignis:

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 

ändern DebugOutput.dll und ReleaseOutput.dll auf den richtigen Dateinamen. Sie können "Debug" und "Release" ändern, um andere Konfigurationen zu unterstützen, und Abschnitte hinzufügen, um mehr Konfigurationen zu unterstützen.


Dieses Skript erstellt zwei DLLs mit unterschiedlichen Dateinamen; Um zwei verschiedene AssemblyNames zu erstellen, haben Sie zwei Möglichkeiten.

Der Montage Name wird als follows gebaut:

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

Also muss man entweder die Info Kultur ändern, die Version oder den starken Namen.

Die beiden einfachsten Optionen sind:

  1. Ändern Sie die Assemblierung-Version:

    #if SOME_COMPILER_SYMBOL 
    [assembly: AssemblyVersion("1.0.0.0")] 
    #else 
    [assembly: AssemblyVersion("1.0.0.1")] 
    #endif 
    
  2. Ändern Sie die Schlüsseldatei - erstellen zwei Keyfiles mit dem sn Werkzeug und in AssemblyInfo.cs:

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

Diese beiden Optionen führen zu zwei verschiedenen Assemblies, soweit der GAC dies weiß - da der vollständige Assemblyname und nicht der 'einfache' Name verglichen wird.

+0

Sie löschen es und benennen es um? Sie sollten es nicht löschen müssen, benennen Sie es einfach um. oder verpasse ich etwas? :-) –

+0

Könnte sein, dass eine ältere Version noch da bleibt. –

+0

Ja, der Umbenennungsvorgang wird nicht überschrieben. Sie können 'move/y" $ (TargetPath) "" $ (TargetDir) ReleaseOutput.dll "' statt der Del-Rename-Zeilen verwenden - der Verschiebevorgang kann überschreiben. – configurator

-1

Ich denke, es gibt keinen solchen Weg. Der Name der Ausgabemontage ist in den Projekteinstellungen fest vorgegeben: Eine Assembly pro Projekt.

Auch AssemblyAttributes, die Sie angeben, zeigt nur sichtbare Baugruppeneigenschaften an (z. B. in Windows Explorer), nicht den Dateinamen.

3

Visual Studio lässt keine pro-konfigurierten Ausgabedateinamen zu. Sie können die Ausgabedatei jedoch als Teil Ihres Build-Skripts umbenennen. Sie können dies in Ihrem MSBuild-Skript für das betreffende Projekt tun.

Zum Beispiel setzt diese am Ende Ihrer CSPROJ Datei:

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

Hallo Kent, ich denke, das ist die Lösung für mein Problem ist aber MSBuild nicht über einen Befehl wie . Ich habe an Jay Shrestha von Microsoft geschrieben und mir gesagt, dass es in Visual Studio unmöglich ist, das zu tun, was ich will. Stattdessen müsste ich "msbuild.exe" verwenden, um das Projekt zu erstellen. – jaloplo

+0

Visual Studio führt nach jedem Build ein bestimmtes MSBuild-Ziel aus. Bearbeiten Sie das Ziel einfach und verwenden Sie den entsprechenden MSBuild-Task, um die Datei umzubenennen. –

+0

Mein Post aktualisiert, um Ihnen zu zeigen, wie. –

1

Ich habe das selbst nicht versucht, also nimm es als freundlichen Vorschlag. Versuchen Sie manuell bearbeiten Sie Ihre CSPROJ Hinzufügen oder uncommenting das Before Ziel mit einem snipped vom inspiriert folgenden:

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