C# Dynamisch laden van Assembly

Pagina: 1
Acties:

Onderwerpen


  • reapher
  • Registratie: Augustus 1999
  • Laatst online: 14-09 22:19
Ik heb een programma in c# geschreven welke dynamisch assembly dll laad via de functie Assembly.loadFile(). Dit werkt allemaal prima met gecompilde code waar alleen references instaan naar de .net framework.

Echter zodra ik een reference naar me eigen componenten in de dll zet, die dynamisch geladen wordt. krijg ik een fout zodra ik de boel ga runnen. Deze fout heeft er mee te maken dat de moeder programma (het programma dat de dll dynamish laadt) niet deze reference dll''s laad.

Ik krijg dan de foutmelding:

code:
1
System.IO.FileNotFoundException: Kan bestand of assembly HttpRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null of een van de afhankelijkheden hiervan niet laden. Het systeem kan het opgegeven bestand niet vinden. Bestandsnaam: HttpRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null


Echter als ik in het moederprogramma deze reference toevoeg doet hij het perfect. Alleen dit is niet handig.

Heeft iemand de oplossing?

Click hier niet


  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Misschien heb je hier iets aan?

Skill is when luck becomes a habit.


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Als je nu eens zou zeggen hoe je die assembly precies dynamisch laadt, dan zouden we je misschien wel kunnen helpen. :)

Maw: PRG Quickstart :)

Zit die assembly in de GAC ? Waarom zijn references die je 'hard' gelegd hebt, niet handig ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • reapher
  • Registratie: Augustus 1999
  • Laatst online: 14-09 22:19
Hij zit niet in de GAC.

Hier een stukje hoe hij laad

code:
1
2
3
4
5
6
7
8
9
10
11
12
Assembly u = Assembly.LoadFile(libFileLocation);
                    LoadReferenceAssamblies(u, "Glibrary_" + messageC.dataInfo.SystemType);
                    Type t = u.GetType(title_class);
                    if (t != null)
                    {
                        object o = u.CreateInstance(title_class);
                        MethodInfo m = t.GetMethod(title_void);
                        if (m != null)
                        {
                            object[] sendParam = new code.libs.MessageContainer[1];
                            sendParam[0] = messageC;
                            m.Invoke(o, sendParam);


Bij invoke gaat hij dus fout.

References moet ik nu hard zetten in de assambly die de dynamische assambly aanroept. Dat is natuurlijk niet echt handig.

Click hier niet


Acties:
  • 0 Henk 'm!

  • Devion
  • Registratie: Januari 2000
  • Laatst online: 28-02 15:59

Devion

Space for rent ;-)

Je kan opvragen welke references een assembly nodig heeft en die van te voren preloaden (of nog makkelijker.. gooi ze in de GAC)

Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
Als je een Assembly.LoadFrom ipv LoadFile doet gaat het laden van references van die assembly wel automatisch goed.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • reapher
  • Registratie: Augustus 1999
  • Laatst online: 14-09 22:19
Ok maar LoadFrom dan moeten ze in de HAC?

Ik heb wel geprobeerd om de assambly te laden voordat ik deze uitvoer, echter dit wekte ook niet. Waarschijnlijk verkeerd gedaan?

Click hier niet


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
reapher schreef op vrijdag 05 september 2008 @ 18:50:
Ok maar LoadFrom dan moeten ze in de HAC?
West vlaming ? :P :+
Nee, dan moeten ze niet in de GAC. Check de doc's:
LoadFrom(String) Loads an assembly given its file name or path.
Maar, nu hebben we wel al wat code gezien, maar weten we nog niet wat je aan die LoadFile assembly meegeeft ... maw: wat zit er in libFileLocation ?

Dat het niet lukt om die andere assemblies te laden, heeft volgens mij gewoon te maken met het feit dat de .NET runtime ze niet vind. .NET verwacht dat die assemblies ergens zitten, en gaat bepaalde locaties gaan 'proben'.
je zou eens kunnen de Fusion logger gebruiken om te zien waar er allemaal gezocht wordt naar die assemblies, en in welke volgorde.

[ Voor 20% gewijzigd door whoami op 06-09-2008 16:18 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
[b][message=30694773,noline]whoami schreef op zaterdag 06 september 2008 @ Maar, nu hebben we wel al wat code gezien, maar weten we nog niet wat je aan die LoadFile assembly meegeeft ... maw: wat zit er in libFileLocation ?

Dat het niet lukt om die andere assemblies te laden, heeft volgens mij gewoon te maken met het feit dat de .NET runtime ze niet vind. .NET verwacht dat die assemblies ergens zitten, en gaat bepaalde locaties gaan 'proben'.
je zou eens kunnen de Fusion logger gebruiken om te zien waar er allemaal gezocht wordt naar die assemblies, en in welke volgorde.
Het is mijn ervaring dat wanneer je niet uit de current dir of uit de GAC een assembly probeert te laden met Assembly.LoadFrom de .NET runtime referenced assemblies wél kan vinden.

Hmmm, volgens MSDN heeft LoadFrom wel behoorlijk wat disadvantages:
[quote]
The LoadFrom method has the following disadvantages. Consider using Load instead.
  • If an assembly with the same identity is already loaded, LoadFrom returns the loaded assembly even if a different path was specified.
  • If an assembly is loaded with LoadFrom, and later an assembly in the load context attempts to load same the assembly by display name, the load attempt fails. This can occur when an assembly is de-serialized.
  • If an assembly is loaded with LoadFrom, and the probing path includes an assembly with the same identity but a different location, an InvalidCastException, MissingMethodException, or other unexpected behavior can occur.
  • LoadFrom demands Read and F:System.Security.Permissions.FileIOPermissionAccess.PathDiscovery, or WebPermission, on the specified path.
  • If a native image exists for assemblyFile, it is not used. The assembly cannot be loaded as domain neutral.
  • In the .NET Framework version 1.0 and 1.1, policy is not applied.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1