Ho letto tante versioni diverse di questa domanda come sono su Stack Overflow, così come ogni link blu sulla prima pagina di 3 diverse ricerche Google per le esercitazioni, così come MSDN (che è piuttosto superficiale oltre a eseguire gli assembly). Posso solo pensare ai miei sforzi per far funzionare Tao come un buon test, ma credetemi, ho provato con un semplice ritorno di stringa, un double, una funzione con parametri. Qualunque sia il mio problema, non è Tao.C# Caricamento/scaricamento dinamico di DLL Redux (utilizzando AppDomain, ovviamente)
Fondamentalmente voglio creare un testLibraryDomain.CreateInstance()
della mia classe Draw nello spazio dei nomi GLPlugin.
if(usePlugin)
{
AppDomain testLibraryDomain = AppDomain.CreateDomain("TestGLDomain2");
//What the heck goes here so that I can simply call
//the default constructor and maybe a function or two?
AppDomain.Unload(testLibraryDomain);
}
Gl.glBegin(Gl.GL_TRIANGLES);
So per certo che:
namespace GLPlugin
{
public class DrawingControl : MarshalByRefObject
{
public DrawingControl()
{
Gl.glColor3f(1.0f , 0.0f , 0.0f);
//this is a test to make sure it passes
//to the GL Rendering context... success
}
}
}
cambia infatti il colore della penna. Funziona quando gli do un punto di ingresso static void Main(string args[])
e chiamo testLibraryDomain.ExecuteAssembly(thePluginFilePath)
Se un ExecuteAssembly diretto avrebbe funzionato o meno mi riguardava, poiché non ero sicuro che GL Calls sarebbe entrato nel contesto OpenGL di "livello superiore" di AppDomain. Mi consente persino di sovrascrivere il gruppo e cambiare il colore della penna una seconda volta. Sfortunatamente dargli un punto di accesso eseguibile significa che una console popup mi interrompe e poi se ne va. Funziona anche quando mi limito a dargli un riferimento nel Progetto e creo un normale GLPlugin.DrawingTool tool = new GLPlugin.DrawingControl()
, o anche creando un someAssembly = Assembly.LoadFrom(thePluginFilePath)
(che ovviamente e, purtroppo, blocca l'assieme, impedendo la sostituzione/ricompilazione).
Quando si utilizza uno dei vari metodi che ho provato, ottengo sempre "il nome dell'assembly specificato o il suo codice base non è valido." Lo prometto, è valido Qualcosa nel modo in cui sto cercando di caricarlo non lo è.
Una cosa che so mi manca è una corretta messa a punto per la testLibraryDomain.CreateInstance(string assemblyName , string typeName);
Per quanto posso dire, l'argomento AssemblyName non è il percorso del file per il file di assieme. È lo spazio dei nomi, o anche solo il nome dell'assembly, ovvero: GLPlugin
? In tal caso, dove faccio riferimento al file attuale? Non ci sono alcuni AppDomain.LoadFrom (someFilename), anche se sarebbe pericoloso se ce ne fossero. Inoltre, che diamine è il Type e string typeName? Non voglio inserire "Object"
qui, perché non sta creando un tipo diverso da un'istanza di un oggetto? Ho anche provato CreateInstanceAndUnwrap(... , ...)
con la stessa mancanza di una comprensione fondamentale di AppDomain. Di solito riesco a cavarmela attraverso le esercitazioni e a far funzionare le cose, anche se spesso non capisco il "Perché?" ... non è così. Di solito è utile per me cercare sei diversi tutorial ... non di nuovo qui, ma perché ognuno prende un approccio fondamentalmente (o ciò che sembra essere così).
Quindi, per favore ELI5 ... Voglio caricare un'istanza di una classe da una DLL in un AppDomain separato, magari eseguire alcune funzioni e scaricarla. Alla fine creiamo un elenco di queste funzioni come Elenco, rimuovendo/aggiornando come necessario ... Mi piacerebbe essere in grado di passare argomenti anche a loro, ma quello sarà il passaggio 2. Secondo StackOverflow, devo imparare su serializable
che rimanderò per un altro giorno. (Immagino che sarai in grado di capire dal mio esempio cosa sto cercando di fare.)
Per caricare assiemi senza blocco Penso che sia preferibile utilizzare Copia shadow, vedere http://msdn.microsoft.com/en-us/library/ms404279.aspx. – Maarten
Sono curioso del tuo esempio, ancora probabilmente a causa di una mancanza di conoscenze fondamentali ... dove si "applica" il nuovo 'loadedAssembly' all'appDomain' apd' piuttosto che al primo livello predefinito? È solo implicito nell'ordine, come in hai creato un AppDomain, quindi tutto ciò che è sotto di esso è parte di esso fino a 'Unload()'? Inoltre, ottimo articolo, un po 'sopra la mia testa però. Ho letto una parte di esso che è stata strappata e inserita in un sito di annunci, ma è bello avere l'articolo completo. Cercherò di imparare davvero da esso attraverso il corso di oggi. Tipo di desiderio che avesse un file sorgente funzionale. – Adam
Non sono sicuro che capisco la tua domanda, ma proverò a giocare con alcuni esempi e commenti della mia vecchia applicazione più tardi oggi. –