Autor Beitrag
aminitoy
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 01.09.10 10:03 
Hallo.

Ich habe gerade versucht mit codebase eine Library aus einem anderen Verzeichnis zu laden.
Jedoch tritt folgender Fehler auf:

System.IO.FileLoadException:

{"Could not load file or assembly 'MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The private assembly was located outside the appbase directory. (Exception from HRESULT: 0x80131041)":"MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"}

Anscheinend passt der codebase Eintrag und er findet die library, kann sie aber nicht laden. Finde zum Thema appbase im Internet leider nicht sehr viel.

Weiss jemand mehr?

Danke
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mi 01.09.10 14:44 
Du willst die Assembly dynamisch laden, mittels System.Reflection? Die Umschreibung deines Problems ist etwas dürftig. Ein bissl Code wäre nicht schlecht.

Also, ich gehe mal davon aus, du versuchst mit Assembly.CodeBase und Assembly.Load die dll zu laden? Wenn du weißt, wo die Assembly liegt, ist es einfacher, du nimmst Assembly.LoadFile(<Path>).
aminitoy Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 01.09.10 15:25 
Hallo,

stimmt war nicht genau genug.

Meine library (myFirstAssembly.dll) wird von der exe file reingeladen.
Meine library verwendet objekte von myAssembly.dll.
Als ich versucht habe mit Assembly.LoadFile die dll zu laden hat das nichts gebracht, da ich die Library beim kompilieren bereits brauche(wo er sie auch findet). Ich arbeite in Framework 2.0 und habe das schlüsselwort dynamic daher nicht zur Verügung. Habe auch leider kein Interface.

Zuerst habe ich versucht die AppDomain zu erweitern, jedoch geht das denke ich nur ein eine Richtung.
Bsp: C:\Program Files\Some Directory\myAssembly.dll
AppDomain: C:\Program Files
AppDomain.AppendPrivatePath("\Some Directory");

Jedoch sieht es bei mir so aus:
Bsp: C:\Program Files\Some Directory\myAssembly.dll
AppDomain: C:\Program Files\Some Other Directory
AppDomain.AppendPrivatePath(?);

Deswegen habe ich versucht den suchpfad der applikation zu erweitern. Dazu habe ich <codebase> verwendet.
Ich habe die exe.config wie folgt erweitert:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="null"
                              culture="neutral" />
            <codeBase version="1.0.0.0"
                      href="C:\Program Files\Some Directory\myAssembly.dll"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>


Somit hat er die dll auch gefunden. Jedoch kam eine andere Exception:


System.IO.FileLoadException:

{"Could not load file or assembly 'MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The private assembly was located outside the appbase directory. (Exception from HRESULT: 0x80131041)":"MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"}


Ich hoffe das ist soweit klar.

vielen dank

Moderiert von user profile iconChristian S.: XML-Tags hinzugefügt
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mi 01.09.10 15:56 
Wieso lädst du sie dynamisch, wenn du sie beim kompelieren bereits brauchst?
aminitoy Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 01.09.10 17:07 
beim kompilieren habe ich sie ja auch zur verfügung. da kann er das verzeichnis auflösen.
nur zur laufzeit findet er es nicht mehr. ich lade sie ja nicht dynamisch.
ich versuche nur den suchpfad (oder appdomain) zu erweitern.

lg
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mi 01.09.10 18:31 
Jo, aber warum fügst du nicht einfach einen Verweis im Projektmappen-Explorer auf die dll hinzu?
aminitoy Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 02.09.10 08:28 
Das habe ich. Unter Referenzen habe ich es hinzugefügt. Sonst könnte ich nicht kompilieren.
Ich kompiliere die benötigte library jedoch nicht mit. So dass er sie zur Laufzeit nicht mehr findet.
Wäre sie im gleichen Verzeichnis mitkompiliert, würde er sie ohne Probleme finden.

Bsp:
Wenn C:\Program Files\Some Directory mein Verzeichnis ist in das ich kompiliere und myAssembly rein kompilieren würde ->
C:\Program Files\Some Directory\myAssembly.dll
würde er sie finden.

Bei mir liegt sie jedoch in:
C:\Program Files\Some Other Directory

Ich habe jetzt versucht den Suchpfad so zu erweitern, dass auch in diesem Verzeichnis nachsieht.. Dann kam der Fehler.

Oder gehe ich das grundsätzlich falsch an?

danke und lg
aminitoy Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 02.09.10 10:51 
Im Anhang mein Projekt
Einfach starten und man sieht die Fehlermeldung.

Ich bitte um Hilfe.

Dankeschön
Einloggen, um Attachments anzusehen!
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Do 02.09.10 13:24 
also bei mir funktioniert es sobald ich dein in der Config zugefügten Code lösche. Warum kompelierst du eigentlich nicht einfach ins selbe Arbeitsverzeichnis?
aminitoy Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 02.09.10 13:30 
Hallo, Ja wenn ich in das selbe Verzeichnis kompiliere kann ich mir alles sparen.
Aber das darf ich eben nicht, weil diese Komponente dort nicht hingehört. Sie wird gelegentlich noch von wo anders verwendet und liegt deswegen in einem Shared Verzeichnis.

danke und lg
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Do 02.09.10 15:40 
Dann wäre der optimale Weg, die FinalVersion im GAC zu registrieren. Dann ist es egal, wo sie liegt und du kannst global zugreifen. Ich würde dir dann empfehlen, während der Entwicklung die dll mit zu kompelieren und in der finalen Version (wenn die dll fertig ist) den GAC zu nutzen. Dann lösen sich deine Probleme in Luft auf.

Für diesen Beitrag haben gedankt: aminitoy
aminitoy Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 09.09.10 10:40 
Hi,

Danke für deine Unterstützung. GAC wollte ich eigentlich vermeiden, da ich schon öfter negatives gehört habe, aber anscheinend lässt sich das auf andere
Weise nicht lösen.

lg
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 09.09.10 13:16 
Hast du schon einmal in die Hilfe geschaut?
msdn.microsoft.com/e...ibrary/efs781xb.aspx hat folgendes geschrieben:
If the assembly has a strong name, the codebase setting can be anywhere on the local intranet or the Internet. If the assembly is a private assembly, the codebase setting must be a path relative to the application's directory.

Einen starken Namen bräuchtest du für den GAC ja sowieso :) .

_________________
>λ=