c# - How to reference a GAC-assembly from a dynamically generated assembly? -


i'm teaching myself intermediate language (il) generation in c#, , i've been stuck-for-a-couple-of-hours-which-seem-like-days on how reference system.windows.forms.dll (for example) dynamic assembly, i'm generating using appdomain.currentdomain.definedynamicassembly , system.reflection.emit... based on most-excellent-example @ http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html

i've got basic transferobjectdllgenerator working, i'd reference existing libraries (only) within generated assembly, , can't figure out how.

this question lead me appdomain.currentdomain.assemblyresolve event. tried implementing event handler it's never triggered, guess i've done dumb, put event handler in wrong place?

any pointers in right direction appreciated.

here's mainline... interesting bits // <<-- commented thus

using system; using system.reflection; //using system.windows.forms; (and removed project's reference system.windows.forms)  namespace ilgen { /// <summary> /// generates .\bin\$whatever\personlibrary.dll containing msil equivalent to: ///   namespace personlibrary { ///     public class person { ///       public string firstname { get; set; } ///       public string lastname { get; set; } ///       public person() { } ///       public person(string firstname, string lastname) { ///         firstname = firstname; ///         lastname = lastname; ///       } ///     } //end-class ///   } //end-namespace /// </summary> public class program {     public static void main(string[] args) {         appdomain.currentdomain.assemblyresolve += myassemblyresolver; // <<-- hook "resolve assembly" event.         try {             var dll = new transferobjectdllgenerator("personlibrary");             dll.addclass("person", new[] {                 new property("firstname", typeof(string))               , new property("lastname", typeof(string))               , new property("ok", type.gettype("system.windows.forms.button")) // <<-- references system.windows.forms.dll; type.gettype returns null.             });             console.writeline("generated: " + dll.save());         } {             appdomain.currentdomain.assemblyresolve -= myassemblyresolver; // <<-- unhook "resolve assembly" event.         }     }      static assembly myassemblyresolver(object sender, resolveeventargs args) // <<-- handle "resolve assembly" event.     {         if ( args.name.startswith("system.windows.forms.") ) // <<-- breakpoint here, never reached.             return assembly.loadfrom(@"c:\windows\winsxs\msil_system.windows.forms_b77a5c561934e089_6.0.6001.22230_none_1a2132e45d2f30fc\system.windows.forms.dll");         return null;     } } // end-class } // end-namespace 

if need/want transferobjectdllgenerator code please shout... haven't posted because it's bit big (imho) forum post.

thanks in advance time.

cheers. keith.


edit: provide working example finds thread in future.

there no need provide custom assemblyresolve event handler. phurphy. need provide fully-qualified-name of assembly... 1 assembly-name, namespace, version, , guid.

using system; using system.reflection;  namespace ilgen { public class program {     public static void main(string[] args) {         var dll = new transferobjectdllgenerator("personlibrary");          // need provide fully-qualified-assembly-name          // make standard assembly-resolver search gac.          // julien lebosquain pointing out.         type buttontype = type.gettype(             "system.windows.forms.button, system.windows.forms, version=2.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089");          dll.addclass("person", new[] {             new property("firstname", typeof(string))           , new property("lastname", typeof(string))           , new property("ok", buttontype)          });         console.writeline("generated: " + dll.save());     } } // end-class } // end-namespace 

type.gettype without assembly name specified search type name in current assembly , in mscorlib.

try use assemblyqualifiedname of type. here .net 4:

type.gettype("system.windows.forms.button, system.windows.forms, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089") 

the default resolver search in gac , app domain private path should have nothing behavior desire. if have customize resolution, assemblyresolve or new type.gettype overload taking resolver function in .net 4 way go. note resolving manually gac or winsxs paths bad idea: let framework resolving job.


Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -