none
Invocar método propio de una clase creada mediante AppDomain.CreateInstance RRS feed

  • Pregunta

  • Hola,

    Acudo a su abundante poder intelectual para que por favor me ayuden a resolver el siguiente problema que estoy viviendo:

    Tengo una app en un lenguaje no administrado, en la cual hago uso de una extensión de C++ y C# para llamar aplicaciones administradas no referenciadas dentro del proyecto, ya que la necesidad es que sea en tiempo de ejecución y sin acople de archivos en el proceso.

    Para poder hacer esto, hago uso de la clase AppDomain, creó un domain propio del proceso de la app, y hago uso del método CreateInstanceFrom para hacer una instancia de una clase en un ensamblado totalmente ajeno a la app principal.

    Hasta aquí todo me ha funcionado de maravilla, mi real problema es que hasta este punto, el objeto que me devuelve la instancia de la clase del dll externo es de tipo ObjectHandle del espacio de nombres System.Runtime.Remoting, y obviamente, de este tipo no he logrado obtener el método que necesito que si está contenido dentro de la dll externa que, hasta aquí, (según veo) está bien instanciada.

    Este es el código de la clase del dll externo que requiero consumir, hasta aquí, lo único que me falta es poder utilizar el método CallPatient:

    namespace Servinte.ClinicalSuite.Gespac.Services.Integration {
        public class EntryGespac : MarshalByRefObject
        {
            #region Constructor
            public EntryGespac() { }
            #endregion
            #region Métodos
            public int CallPatient(string args)
            {
                int History = -1;
    
                using (PatientSearchHelper helper = JsonConvert.DeserializeObject<PatientSearchHelper>(args))
                {
                    if (helper.Initialize())
                    {
                        helper.ParametersToLoadProgram = args;
                        History = helper.Getpatient();
                    }
                }
    
                return History;
            }
            #endregion
        }
    }

    Este es el código de la dll que administra el llamado a los ensamblados externos, hasta ahora tiene los datos quemados para poder probar:

    public static void Call_SCSE_Application()
            {
                const string DOMAIN_NAME = "SCSE_Domain";
                const string PATH = "C:\Users\danaguus\Desktop\Desktop\Gespac 15.2\Gespac\Gespac 2.0\Net\V2.0\GesPac\Services\Gespac.Services.Integration\bin\x86\Debug\";
                const string TEST = "Servinte.ClinicalSuite.Gespac.Services.Integration.dll";
                ApiResponse = string.Empty;
                AppDomain SCSE_Domain = null;
                AppDomainSetup SCSE_DomainSetup = Thread.GetDomain().SetupInformation;
                try
                {
                    SCSE_DomainSetup.ApplicationBase = PATH;
                    SCSE_DomainSetup.LoaderOptimization = LoaderOptimization.MultiDomainHost;
                    SCSE_DomainSetup.DisallowPublisherPolicy = false;
                    SCSE_Domain = AppDomain.CreateDomain(
                                                            DOMAIN_NAME, // Custom name for domain handler
                                                            Thread.GetDomain().Evidence, // Copy from default domain application
                                                            SCSE_DomainSetup, // Copy from default domain application
                                                            Thread.GetDomain().PermissionSet // Copy from default domain application
                                                        );
                    CanExecute();
    
                    ObjectHandle instance = SCSE_Domain.CreateInstanceFrom(string.Concat(PATH, TEST), "Servinte.ClinicalSuite.Gespac.Services.Integration.EntryGespac");
                    MethodInfo memberToCall = instance.GetType().GetMethod("CallPatient");
                }
                catch (Exception e) {
                    ApiResponse = e.Message.ToString();
                    MessageBox.Show(ApiResponse, e.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    try { AppDomain.Unload(SCSE_Domain); }
                    catch (Exception e)
                    {
                        if (!e.Equals(typeof(ArgumentNullException)))
                        {
                            ApiResponse = e.Message.ToString();
                            MessageBox.Show(ApiResponse, e.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    GC.SuppressFinalize(SCSE_DomainSetup);
                    GC.SuppressFinalize(SCSE_Domain);
                    GC.Collect();
                }
            }

    Les agradezco sus aportes, en verdad los necesito.

    Saludos.

    Daniel.


    Daniel..


    miércoles, 24 de abril de 2019 16:57