samedi 30 octobre 2021

Why usage of dynamic throws exception in runtime?

I have an external dll I'm loading into my appdomain during runtime.

I'm creating an instance of a class from that assembly into a local dynamic variable.

As far as I understood the usage of dynamic in C#, I can simply call a method of it, which will be resolved at run time...

Using this approach, the following code gets me a runtime "'object' does not contain a definition for 'Get'" exception.

I'll try to illustrate the structure as I can't expose the actual code.

External dll name: a.b.c

namespace Ext
{
  public static class FactoryCreator
  {
    public static ProxyFactory CreateFactory()
    {
        return new ProxyFactory();
    }
  }


  public interface FactoryIfc
  {
    Proxy Get();
  }

  internal class ProxyFactory: FactoryIfc
  {
    private Proxy proxy;

    public Proxy Get()
    {
      if (this.proxy == null)
        this.proxy = <a method to create a proxy>
      return this.proxy;
    }
  }
}

I'm using the following code

var assembly = "a.b.c, Version=1.0.0.0, Culture=neutral, PublicKeyToken=<key>,processorArchitecture=MSIL";
var instName = "Ext.FactoryCreator";
dynamic factoryCreator = AppDomain.CurrentDomain.Load(assembly).GetType(instName).GetMethod("CreateFactory").Invoke(null, new object[0]);
dynamic factory = factoryCreator.CreateFactory();
dynamic proxy = factory.Get();

I understand that for FactoryCreator dynamic variable, I need to get the Type and invoke the static method of it, but.. as I said, it is throwing an exception "'object' does not contains a definition for 'Get'" - at the factory.Get() statement - while I would expect dynamic factory to be resolve automatically to the object and service the Get() call.

Observing the situation under a debug session, I can clearly see the Get method using factory.GetType().GetMethods() in the quickwatch window.

Can you explain what is happening?

enter image description here

Must I use factory.GetType().GetMethod("Get") followed by an Invoke? I thought the power of dynamic should work this out automatically in runtime...





Aucun commentaire:

Enregistrer un commentaire