2010-12-28 7 views
1


Also im Grunde haben wir eine starke Namen (stark signiert) Assembly x.dll, die von einer unserer Komponenten, App.exe verwendet wird. Die Signaturschlüssel der Montage in unserem Repository ist, und es wird die Montage durch das Schreiben unterzeichnetAssembly muss bei jeder Änderung der Benutzer-App in GAC neu implementiert werden

[assembly: AssemblyDelaySign(false)] 
[assembly: AssemblyKeyFileAttribute(@"..\..\xxx.snk")] 
[assembly: AssemblyKeyName("")] 

Die Montage soll durch ein Installateur in GAC zu setzen, die gemeinsame Pakete installiert, lassen Sie uns nennen es common.msi . Aber unsere Komponente selbst wird von App.msi installiert. Wenn es zusammen eingesetzt wird, funktioniert alles. Wenn jedoch Änderungen an App.msi vorgenommen werden, die ABSOLUT NICHT mit x.dll zu tun haben, und App.msi erneut bereitgestellt wird, findet App.exe die Datei x.dll nicht. Beachten Sie, dass keine Änderungen an x.dll vorgenommen werden. Wenn jedoch common.msi ebenfalls bereitgestellt wird, funktioniert alles. Also ich vermute, dass es ein Problem mit Build-Versionen oder etwas geben muss, oder manifestiert, von denen ich nichts weiß. Ist etwas offensichtlich, dass ich falsch mache? Ist es nicht möglich, die Assembly separat bereitzustellen und nicht zu berühren, wenn sie nicht geändert wird, und sie nicht jedes Mal erneut bereitzustellen, wenn eine Komponente, die sie verwendet, geändert wird? Vielen Dank.

Edit: Es ist eine Anforderung (ein ich nichts tun kann), dass die ssembly in GAC

Antwort

1
gesetzt wird

Warum Sie es in die GAC installieren? Tu das nicht.

Der Titel Ihrer Frage "Assembly muss in GAC neu implementiert werden" ist einfach falsch. Nichts, was Sie geschrieben haben, impliziert, dass die Assembly im GAC enthalten sein muss.


EDIT - einige zusätzliche Informationen.

Wenn Sie Abhängigkeiten untersuchen möchten, können Sie Redgate Reflector verwenden, um eine Assembly wie Ihre App.exe zu untersuchen, um festzustellen, auf welche anderen Assemblies es ankommt und welche benötigt wird. Diese Abhängigkeiten enthalten Versionsnummern.

Ich weiß nicht, ein Werkzeug von der Befehlszeile, die nur Assembly Informationen ausgeben wird. Vielleicht gibt es einen. Fehlt diese, schrieb ich ein Werkzeug, es zu tun, wie folgt aus:

public static void Main(string[] args) 
    { 
     if ((((args == null) || (args.Length != 1)) || (args[0] == "-?")) || (args[0] == "-h")) 
     { 
      Usage(); 
     } 
     else 
     { 
      try 
      { 
       Console.WriteLine(Assembly.LoadFrom(args[0]).FullName.ToString()); 
      } 
      catch (Exception exception) 
      { 
       Console.WriteLine("Exception: {0}", exception.ToString()); 
       Usage(); 
      } 
     } 
    } 

Sie dieses Tool auf App.exe sowie x.dll laufen konnte den genauen starken Namen, einschließlich der Versionsnummern, eingebettet in die jeweils zu bestimmen Versammlung.

Dies könnte Ihnen einen Einblick geben, warum die Dinge nicht wie erwartet funktionieren.

Auch wenn sich eine Version von x.dll im GAC befindet, ist keine beliebige App wie App.exe erforderlich, um diese Version der DLL zu verwenden. Die App kann im lokalen Verzeichnis eine eigene Version der DLL installieren.

+0

Das ist eine Anforderung, ich kann es nicht ändern. Es wird angenommen, dass die Baugruppe auch von anderen Komponenten verwendet wird. Und Ihre Antwort beantwortet nichts, leider –

+1

"Von anderen Komponenten verwendet" ist kein gültiger Grund für die Installation in den GAC. Du machst es falsch! – Cheeso

+0

Eine Komponente muss nicht im GAC enthalten sein, um von anderen Komponenten verwendet zu werden. Es muss nur im selben Verzeichnis sein. – Femaref