Dynamické načítanie assembly   zodpovězená otázka

VB.NET

Ahojte priatelia,

poprosil by som o pomoc alebo nasmerovanie k tomuto problému.

Mám materskú aplikáciu(tiež moja aplikácia), ktorá vyhladá moju dll, načíta assembly nájde triedu daného typu a vytvorí jej inštanciu. Toto funguje výborne. Problém nastáva vtedy, keď chcem urobiť v tejto dll zmenu. Napríklad v danej dll zmením názov nejakej premennej. Scompilujem projekt a novú dll so zmenou nakopírujem na miesto, kde bola dll bez zmeny(prepíšem ju). Materská aplikácia stále beží. Dokážem znovu načítať upravenú dll tak, aby som nemusel reštartovat materskú aplikáciu?

Za odpovede ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Musíte zrušit odkazy na danou Assembly a opětovně je načíst. Pokud se držíte stálého interfacu nebo alespoň nemění jména metod pro komunikaci, neměl by v tom být problém.

Popřípadě verzujte sestavení jménem souboru (MojeAssembly_1.0.0.0.dll atp) - tím vyřešíte nutnost restartovat aplikaci kvůli uvolnění souboru.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zmene nazvu dll sa chcem práve vyhnúť. Skúšal som si naprogramovať modelovú situáciu a pri spustenej materskej aplikácií sa nedá DLL vôbec prepísať. Systém vyhodí hlášku "Položka xyz.dll sa nedá presunúť: Súbor so zadaným názvom už existuje. Zadajte iný názov súboru." Akoby materská aplikácia zablokovala prácu s dll kým je načítaná v pamäti. Akonáhle materskú aplikáciu vypnem dá sa s dll normálne pracovať - dá sa prepísať. Nedá sa v materskej aplikácií povedať aby dll uvolnila?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prišiel som na to, že to je pekný problém a vyžaduje celkom obsiahle riešenie. .NET totiž nepodporuje nič také ako assembly.unload

Pekný článok je o tom na codeproject-e

http://www.codeproject.com/KB/cs/dynamic...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusil bych vytvořit vlastní aplikační doménu ve které by kód z knihovny běžel. Aplikační doménu unloadovat lze takže teoreticky by to mohlo vyřešit váš problém (nezkoušel jsem to takže nemohu zaručit že to bude fungovat). Pro tyto pluginové aplikace je to dokonce doporučený postup, protože kód pluginu běží odděleně od kódu hostitelské aplikace (bezpečnostní důvody).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Určite máte pravdu. Prešiel som pár článkov na internete a všade doporučujú tento postup. Ibaže vytvorenie takej aplikácie vypadá byť pekný oriešok - skoro na dizertačku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Rozhodně to není tak složité jak si myslíte. Uvedu co nejjednodušší příklad.

První konzolová aplikace (C:\ConsoleApplication1.exe), bude simulovat DLL pluginu:

Module Module1
  Sub Main()
  End Sub
End Module

Public Interface ITest
  Sub DoSomething()
End Interface

<Serializable()> _
Public Class Test
  Implements ITest
  Public Sub DoSomething() Implements ITest.DoSomething
    MsgBox("OK")
  End Sub
End Class

Druhá konzolová aplikace (C:\ConsoleApplication2.exe), bude simulovat hostitelskou aplikaci:

Module Module1
  Sub Main()
  'Vytvoření nové aplikační domény
  Dim newDomain = AppDomain.CreateDomain("Nová aplikační doména")
  'Načtení instance pluginu do nové aplikační domény
  Dim test = DirectCast(newDomain.CreateInstanceFromAndUnwrap("C:\ConsoleApplication1.exe", "ConsoleApplication1.Test"), ITest)
  test.DoSomething()
  'Uvolnění aplikační domény
  newDomain.Unload()
  End Sub
End Module

Public Interface ITest
  Sub DoSomething()
End Interface

Příklad je zjednodušen, ve skutečnosti by rozhraní bylo v samostatné Assembly, na kterou by měly referenci jak hostitelská aplikace, tak pluginy. Také pokud by se typy v pluginech odvozené od ITest jmenovaly jinak než ConsoleApplication1.Test, bylo by nutné zjistit jejich názvy pomocí Reflection což také není příliš složité.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Ďakujem za ilustračný príklad. Skúsim sa s tým pohrať.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback