2009-04-03 21 views
7

Ich habe eine GlobalAssemblyInfo.cs-Datei im Stamm meiner Lösung, und ich habe etwas wie den folgenden Eintrag darin, um eine starke Benennung meiner Ausgabebaugruppen zu ermöglichen.GlobalAssemblyInfo.cs und starke Benennung

#pragma warning disable 1699 
[assembly : AssemblyKeyFile("..\\keyfile.snk")] 
#pragma warning restore 1699 

Dieser Ansatz hat zwei Nachteile. Erstens, AssemblyKeyFileAttribute ist veraltet, und um Kompilierungswarnungen zu vermeiden, brauche ich die Pragma-Zeilen, die Sie oben sehen. Zweitens muss ich entweder alle meine Projekte in der gleichen Tiefe relativ zum root halten, um den relativen Pfad zu verwenden, oder einen absoluten Pfad verwenden, der einen Checkout-Standort auf den Computern anderer Benutzer (und auf Continuous Integration Servern/Build Agents) vorschreibt. .

Hat jemand eine bessere Lösung als dieses, abgesehen davon, dass jedes Projekt eine starke Benennung in der Projektdatei festlegt?

Antwort

1

Diese Attribute für das Signieren von Schlüsseln wurden aus gutem Grund abgelehnt (Informationsleck), was ein weiterer Grund ist, die Projektroute zu gehen.

Wenn Sie viele Projekte haben, ist es möglich, sie über ein aufgezeichnetes Makro zu setzen oder sogar direkt die .csproj-Dateien zu bearbeiten (stellen Sie sicher, dass sie zuerst von VS entladen werden).

2

Nun, um das Pfadproblem zu vermeiden, können Sie stattdessen [assembly:AssemblyKeyName(...)] verwenden (obwohl IIRC dies auch veraltet ist); Verwenden Sie sn -i, um einen benannten Schlüssel zu installieren. Jede Maschine (die Builds benötigt) müsste diesen Schlüssel hinzufügen.

Andere als das; Ja, Sie müssten wahrscheinlich die Projektdateien bearbeiten.

+0

Einverstanden, das bringt mich um die zweite Ausgabe. –

1

Richard macht einen guten Hinweis auf Informationslecks - Ich habe jetzt Beiträge von Microsofts .NET-Team gefunden, wo sie das beschreiben. Deshalb habe ich für seinen Vorschlag und kommen mit folgendem NAnt Ziel gegangen:

<target name="strongName" description="Strong names the output DLLs"> 
    <foreach item="File" property="filename"> 
     <in> 
     <items> 
      <include name="**/*.csproj"></include> 
      <exclude name="**/*.Test.csproj"></include> 
     </items> 
     </in> 
     <do> 
     <echo message="${filename}" /> 
     <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:SignAssembly" value="false"> 
      <namespaces> 
      <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" /> 
      </namespaces> 
     </xmlpoke> 
     <xmlpoke file="${filename}" xpath="/m:Project/m:PropertyGroup/m:AssemblyOriginatorKeyFile" value="..\keyfile.snk"> 
      <namespaces> 
      <namespace prefix="m" uri="http://schemas.microsoft.com/developer/msbuild/2003" /> 
      </namespaces> 
     </xmlpoke> 
     </do> 
    </foreach> 
    </target> 

Die <Namespaces> Element notwendig ist, für die XPath in der csproj Datei aufgelöst werden - beachten Sie, dass dies für VS2008 ist, und Etwas anderes könnte in VS2005 benötigt werden.