
Originariamente inviata da
URANIO
Mi spiego meglio.
Devo interfacciami ad un prodotto che ha le sue API per comandarlo.
Tutto funziona SE NON FOSSE CHE, aggiornando la versione del prodotto bisogna aggiornare anche le DLL o non funziona.
Abbiamo pensato quindi di rendere il programma indipendente dalla versione delle DLL e di richiamarle via System.Reflection.Assembly.
Tutto funziona, riesco a chiamare funzioni e leggere property, SE NON FOSSE CHE ho bisogno di gestire anche degli eventi scatenati dalla DLL, e qua c'è il problema... Non riesco a farlo.
Qualcuno ha mai dovuto interfacciarsi ad una dll senza usare riferimenti alla stessa?
Ho trovato questa pagina
https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
Ma non mi è chiaro il funzionamento di ILGenerator.
Ciao "cugino" 
ok, non so dove ti fermi, ma ti posto un esempio funzionante, da li poi vediamo cosa non riesci a gestire nel tuo codice:
DLL da importare (stessa cartella del exe):
codice:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace ClassLibrary1
{
public delegate void MyDelegate(object sender, EventArgs e);
public class Class1
{
Timer timer;
MyDelegate myDel = null;
public Class1()
{
timer = new Timer(1000);
timer.Elapsed += (obj,arg) => OnTick(arg);
timer.Start();
}
protected void OnTick(EventArgs e)
{
if (this.myDel != null)
this.myDel(this, e);
}
public event MyDelegate Tick
{
add { this.myDel += value; }
remove { this.myDel -= value; }
}
}
}
Una semplice dll che espone un evento chiamato da un timer e un delegato apposito, ma con argomenti di tipo conosciuto (nel caso siano sconosciuti a priori anche questi, nel tick della classe target usa i dynamic al posto dei tipi conosciuti).
classe target:
codice:
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
const string libraryName = "ClassLibrary1.dll";
const string typeName = "ClassLibrary1.Class1";
const string eventName = "Tick";
const string delegateTypeName = "ClassLibrary1.MyDelegate";
const string methodName = "OnTick";
public Form1()
{
InitializeComponent();
//carico l'assembly (dll)
Assembly sourceAsm = Assembly.LoadFrom(libraryName);
//recupero il tipo che contiene l'evento (dll)
Type sourceType = sourceAsm.GetType(typeName);
//recupero il tipo del delegato (dll)
Type delegateType = sourceAsm.GetType(delegateTypeName);
//recupero l'evento (dll)
EventInfo sourceEvent = sourceType.GetEvent(eventName);
//recupero il metodo target in questo caso il metodo OnTick di questa classe
MethodInfo targetMethod = typeof(Form1).GetMethod(methodName,BindingFlags.Public | BindingFlags.Instance);
//Creo una istanza del tipo che contiene l'evento (dll)
object dllObj = Activator.CreateInstance(sourceType);
//creo il delegato
Delegate d = targetMethod.CreateDelegate(delegateType, this);
//aggiungo il delegato all'evento
sourceEvent.AddEventHandler(dllObj, d);
}
public void OnTick(dynamic sender, dynamic e)
{
MessageBox.Show("Hello");
}
}
}