Solved

Reflect an Assembly in a different AppDomain

Posted on 2009-05-08
5
1,133 Views
Last Modified: 2013-11-08
I am developing a plugin system -- much like you have seen posted before.  So I need to be able to load a plugin (assembly) from a different folder then the running app and load into into a separate appdomain (therefor I can have mutliple version and/or unload without restartign the program).  -- But this isn't the real tricky part, I can do this part using MarchByRef and Creating the new AppDomain.CreateInstanceAndUnwrap.  The problem lies is that this approach requires that I know the class name.  Unfortuantely, I dont know the class names, because of the unique nature of this application there is 1000s of different classes that they can augment.  The class has an custom attribute that defines is role.  So what I need to be able to do is just open the assembly in that other appDomain and do .GetTypes().

If I did it in the current AppDomain I could do something like:
Assembly oAssembly = Assembly.LoadFrom(sAssemblyPath);

//Loop Through Classes creatign new packages
foreach (Type oType in oAssembly.GetTypes())
{
      //if Type is an object class
      if (oType.IsClass)
      {
            object[] oAttributes = oType.GetCustomAttributes(typeof(JobStudio.Data.DefinitionAttribute), true);

...


However, now I am trying to do:
//Get Assembly Name
System.Reflection.AssemblyName oAssemblyName = System.Reflection.AssemblyName.GetAssemblyName(AssemblyPath);

//Load Assembly
// Set up the Evidence
Evidence Evidence = new Evidence(AppDomain.CurrentDomain.Evidence);

//Setup Info
AppDomainSetup AppDomainSetup = new AppDomainSetup();
AppDomainSetup.ApplicationBase = "file://" + FolderPath;
AppDomainSetup.PrivateBinPath = "file://" + FolderPath;
AppDomainSetup.ApplicationName = sPackageGuid;

// Create the AppDomain      
AppDomain AssemblyAppDomain = AppDomain.CreateDomain(
      sNewAppName,                              //AppDomain Name
      Evidence,                                    //Security Info
      AppDomainSetup                              //AppDomain SetupInfo
      );

      //Load type-casted Engine
      System.Reflection.Assembly oAssembly = AssemblyAppDomain.Load(oAssemblyName.FullName);

      //Loop Through Classes creatign new packages
      foreach (Type oType in oAssembly.GetTypes())
      {
            //if Type is an object class
            if (oType.IsClass)
            {
                  object[] oAttributes = oType.GetCustomAttributes(typeof(JobStudio.Data.DefinitionAttribute), true);

However I get an "FileNotFoundError" trying to load the assembly because it is still tryign to load it in the main AppDomain context.

Thanks.
0
Comment
Question by:jasonmartin
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
5 Comments
 
LVL 30

Expert Comment

by:Alexandre Simões
ID: 24344634
I did a lot of plugin based application in the pass and my intent was always to:
  • be able to recognise any new assembly that may appear on the plugin repository
  • validate if that new assembly was in fact a new plugin and attach the it to the application
  • support more that one plugin per assembly
So for this what I do is:
  • have a configured plugin repository folder where I scan for the plugins
  • open each dll file and scan for the types (classes) in it
  • evaluate if the class implements my IPlugIn interface and if so store it on a list
This IPlugIn interface defines a signature of one or more methods that are the generic entrance for all plugins. Based on it I can, for instance, loop through them and invoke a generic Start() method and each will do its thing.

This all thing is done using Reflection... tell me if you need any help on this.

Cheers,
Alex
0
 

Author Comment

by:jasonmartin
ID: 24344792
Thats what I want to do, but it must load into a different AppDomain.  Can you provide some examples of how you did this.
0
 

Author Comment

by:jasonmartin
ID: 24474652
Do you have any ideas/examples on how to do this?  Is it possible?
0
 
LVL 30

Expert Comment

by:Alexandre Simões
ID: 24475880
I'm sorry mate, I don't have much spare time to do a concept project.
Have you tried to use the Activator to instantiate the object on the AppDomain and then iterate through its types?

Have a look: http://msdn.microsoft.com/en-us/library/ms224132.aspx

Please get back if you need any further assistance.
It would be helpful if you could create the concept project so I could try to fix it in a short amount of time.

Cheers!
Alex
0
 

Accepted Solution

by:
jasonmartin earned 0 total points
ID: 24829076
I learned that this is a limitation of .NET, that is why Microsoft has recently released the Addin SDK.
0

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…

749 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question