Dll mozes da dodas kao embeded resource u exew fajl. U runtime-u, kao sto je mmx rekao mozes da koristis AppDomain.AssemblyResolve event, koji se ispaljuje kad framework ne moze da pronadje odredjeni dll u radnom direktorijumu aplikacije ili u GAC-u.
Hvatanjem tog eventa mozes da ucitas svoj assembly iz Assembly.GetExecutingAssembly().GetManifestResourceStream()... (nadam se da nisam pogresio, pisem napamet). Kad pokupis ManifestResourceStream, mozes da upotrebis megod Assembly.Load(Stream) i vratis ucitani dll. AssemblyResolve delegat ima povratnu vrednost i to je dll koji si ucitao ili nisi. Ako vrati null, dobicces exception. Nadam se da ovo nije previse konfuzno opisano.
De ne bi bilo napamet evo malo koda:
Code:
static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("WindowsApplication3.res.ClassLibrary1.dll");
int len = (int)stream.Length;
byte[] bytes = new byte[len];
stream.Read(bytes, 0, len);
return Assembly.Load(bytes);
}
kad pozoves sledeccu liniju, desicce se CurrentDomain_AssemblyResolve (ovo samo u slucaju da u radnom folderu nemas trazeni dll):
Code:
ClassLibrary1.Person p = new ClassLibrary1.Person();
Console.WriteLine(p.Name);
Pazi, "WindowsApplication3.res.ClassLibrary1.dll" je dll koji sam dodao kao "Embeded Resource". Nisam ga uzeo iz radnog foldera u koji ga je studio strpao, vecc sam ga iskopirao u drugi folder, iz kog sam da oznacio kao Embeded.
Nije me mrzelo, pa sam napravio neku pilot aplikaciju, koja radi taj posao. Izvini sto se nisam vezao za ILMerge, ali ja to duze vreme radim ovako.