Laden...

Programm unabhängig von bestimmter Assemblyversion machen

Erstellt von Pioneer17 vor 12 Jahren Letzter Beitrag vor 12 Jahren 5.661 Views
P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren
Programm unabhängig von bestimmter Assemblyversion machen

Hallo Zusammen

In einem Programm habe ich einen Assembly eingebunden und Verweise auf diesen.
In VS2008 kann ich unter diesem Assembly angeben ob es eine spezifische Version sein soll oder nicht. Dort stelle ich auf false.

Sobald ich aber das Programm starte und im Startverzeichnis nicht die gleiche Version gefunden wird, stürzt das Programm mit der Meldung "Die Assembly xy mit V.xxx oder...wurde nicht gefunden".

Ich habe mir mal die einzelnen Files die VS erstellt durchgeschaut, jedoch nirgens gefunden wo ich das einstellen könnte dass es keine Rolle spielt welche Version vom Assembly vorhanden ist.

Gibt es dazu ggf. eine Lösung?

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

Soweit ich weis, kann man dazu die config-Datei anpassen.
Dazu gab es hier auch mal einen Beitrag. Entweder hier danach suchen, oder die MSDN-Dokumentation bzgl. der config-Dateien durchstöbern.

EDIT: Siehe übernächsten Beitrag von JuyJuka

Nobody is perfect. I'm sad, i'm not nobody 🙁

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

sobald eine Assembly mit Strongname eingebunden wird so wird immer versucht genau diese Assembly zu verwenden. Ohne Strongname wird jene Assembly verwendet welche den passenden (Datei-) Namen hat.

D.h. binde eigene Assemblies ohne Strongname ein und das Problem löst sich. Ansonsten siehe/suche nach "side by side execution".

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

2.187 Beiträge seit 2005
vor 12 Jahren

Hallo @Pioneer17,

Man kann in der *.config standardmäßig AssemblyVersionen "umbigen":

...
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Aisys.ReflectionVersion.Implementation" publicKeyToken="b317d753de0a0d60" />
        <bindingRedirect oldVersion="2.0.0.0-2.0.0.31" newVersion="2.1.0.5" />
      </dependentAssembly>
  </runtime>
...

Eventuell reicht das ja schon.

Gruß
Juy Juka

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Besten Dank für die ersten Antworten.

@JuyJuka
Bei diesem Projekt gibt es diese .config Datei nicht. Wie kann ich eine solche von VS erzeugen lassen?

@gfoidl
ok, ich gehe davon aus, dass ein Assembly mit Strong Name versehen wird (hab ein Tool bei MS gefunden welches einen Assembly mit Strong Name erzeugt)
Das ist ein "fremder" Assembly, ich gehe nicht davon aus, dass ich diesen Strong Name entfernen kann, oder?
Eingebunden habe ich ihn "normal" über Verweise.

1.346 Beiträge seit 2008
vor 12 Jahren

Du kannst sie erzeugen lassen. Einfach Element hinzufügen => Anwendungskonfigurationsdatei

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

ok

Nach dem ich die .config Datei erzeugen konnte, wollte ich heraus finden welchen publicKeyToken meine Assembly hat. Dazu habe ich unter VS-> Externe Tools einen Befehl hinzugefügt welcher ein Projekt nach strong name Assemblys durchsucht und diese publicKeyToken dann ausgibt (Get &PublicKeyToken). Wenn ich das jetzt mache sagt mir VS aber, dass in diesem Projekt keine Strong Name Assembly verwendet werden...

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

in dem von dir verlinkten Blog-Beitrag steht die Befehlszeile für das Tool sn.exe. Das kannst du von der Command-Prompt ausführen und den Pfad zu der besagten Assembly solltest du kennen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Den publicKeyToken hab ich nun, jedoch stellt sich immer noch die Frage wie ich prüfen kann ob es sich um bei diesem Assembly um einen Strong name handelt oder nicht?

Die config Datei sieht nun wie folgt aus


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="IAStorUIHelper" publicKeyToken="0864863fcbc5bc91" />
        <bindingRedirect oldVersion="10.5.0.1015" newVersion="10.1.0.1008" />
        <assemblyIdentity name="IAStorUtil" publicKeyToken="0864863fcbc5bc91" />
        <bindingRedirect oldVersion="10.5.0.1015" newVersion="10.1.0.1008" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Jedoch kommt die Fehlermeldung noch immer

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

jedoch stellt sich immer noch die Frage wie ich prüfen kann ob es sich um bei diesem Assembly um einen Strong name handelt oder nicht?

Wenn du mit sn.exe -Tp einen Token erhalten hast so gibt es einen Strongname sonst nicht. Das könnte aber auch mit sn.exe -v geprüft werden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

@gfoidl
Besten Dank, diese Frage ist somit geklärt.

Wenn es über die config Datei nicht geht heisst das, dass es keinen Weg gibt verschiedene Assemblyversionen zu verwenden ohne das Projekt neu zu kompilieren?
Oder habe ich die config Datei falsch erstellt / falsche Einträge?

2.187 Beiträge seit 2005
vor 12 Jahren

Hallo Pioneer17,

Welche .config Datei? In .Net gibt es immer nur eine Gültige .config Datei und du musst die richtige erwischen. (Falls du die Frage nicht richtig verstehst: In welchem Projekt (.dll/.exe?) hast du die Anwendungs-Konfiguration hinzugefügt?)

Gruß
Juy Juka

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Hi JuyJuka

wie pdelvo beschrieben hat, habe ich die Konfig Datei in diesem Projekt hinzugefügt in welchem auch diese Assemblys verwendet werden.

2.187 Beiträge seit 2005
vor 12 Jahren

Hallo Pioneer17,

Es gilt nur die *.config des Projekts welches ausgeführt wird (sprich die .exe/.exe.config).
Die anderen *.config-Dateien werden ignoriert (Die Einstellungen die man im Projekt macht sind gültig, da diese als fallback/standard in die Assembly ein-compiliert werden, siehe auch Settings.designer.cs).

Also: In welchem Projekt hast die *.config hinzugefügt?

Gruß
Juy Juka

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Hi JuyJuka

ja es ist die projekt.exe.config Datei. In dieser sind die Einstellung wie du sie gezeigt hast (mehr oder weniger)...

2.187 Beiträge seit 2005
vor 12 Jahren

Hallo Pioneer17,

Mhm ... k ... jetzt gehen mir die üblichen Verdächtigen für Fehler mir <assemblyBinding> aus.

Kannst du uns die Fehlermeldung und/oder Config (auch ausschnitt) schicken?

Gruß
Juy Juka

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Also hab die Config hier:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="IAStorUIHelper" publicKeyToken="0864863fcbc5bc91" />
        <bindingRedirect oldVersion="10.5.0.1015" newVersion="10.1.0.1008" />
        <assemblyIdentity name="IAStorUtil" publicKeyToken="0864863fcbc5bc91" />
        <bindingRedirect oldVersion="10.5.0.1015" newVersion="10.1.0.1008" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

Die Config Datei ist die komplette so wie sie im Rootverzeichnis vorhanden ist.

und da die Fehlermeldung noch

Die Fehlermeldung kommt sobald das Programm gestartet wird. Wenn ich das im Debugger anschaue kommt die Fehlermeldung dort wo er die Form initialisieren möchte.

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Hab jetzt noch div. zusätzliche Dinge versucht wie, nahezu alle DLL's anzugeben, andere Parameter zu setzen, jedoch immer ohne Erfolg.

@JuyJuka
in deinem Bsp gibst du an assembly.ReflectionVersion.Implementation
Muss das von dem Assembly unterstützt werden oder ist das vorgegeben (.ReflectionVersion.Implementation)?

Muss mich wohl damit abfinden, dass ich jedesmal wenn sich diese Version ändert mein Programm ebenfalls updaten muss.

Ggf. hat ja doch noch jemand einen Tipp wie man das lösen könnte.

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Hab nun mal ein Log von Windows eingeschaltet mit welchem ich mehr Infos von dem Fehler erhalte. Trotzdem bringt mich diese Meldung nicht weiter -> aber evtl jemand von euch

2.187 Beiträge seit 2005
vor 12 Jahren

Hallo Pioneer17,

Tut mir leid an der Assembly die ich da verwende ist nichts besonderes.
Handelt es sich bei der IAStorUtil.dll eventuell um eine COM-Dll?

Gruß
Juy Juka

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 12 Jahren

Hmm, also unter Verweise - COM find ich diese DLL's nicht. Ich weiss nicht wo ich das nachschauen könnte ob dieser Assembly eine COM-Assembly ist oder nicht.