1,105,556 Community Members

Reflection Invoke Method w/ Params

Member Avatar
mariocatch
Junior Poster
103 posts since Apr 2007
Reputation Points: 0 [?]
Q&As Helped to Solve: 17 [?]
Skill Endorsements: 0 [?]
 
0
 

Hi All,

A long time ago I researched Reflection and created a solution demoing my learnt capabilities from it.

In my example I did not pass any arguments into the Invocation of the method call using reflection.

I went to tackle this and I seem to be hitting a few dead ends.

Here is the method I call from my Main method in another class.

public void RunClass(string dllName, string className, string methodName, params Object[] parameters)
        {
            // Create the assemblies from our current DLL.
            Assembly _Assemblies = Assembly.LoadFrom(dllName);

            // Get the type that we want from the assemblies.
            //  IE: This would be the fully qualified class name (including namespace)
            //  Example: "Reflectionism.Examples.Example1" or "Reflectionism.Examples.Example2"
            Type _Type = null;
            try
            {
                 _Type = _Assemblies.GetType(className);
            }
            catch (Exception ex)
            {
                Console.WriteLine("\n\nError - couldn't obtain classrd from " + className);
                Console.WriteLine("EXCEPTION OUTPUT\n" + ex.Message + "\n" + ex.InnerException);
                return;
            }

            // Get the desired method we want from the target type.
            MethodInfo _MethodInfo = null;
            try
            {
                _MethodInfo = _Type.GetMethod(methodName, new Type[] { typeof(Object[]) });
            }
            catch (Exception ex)
            {
                Console.WriteLine("\n\nError - couldn't obtain method " + methodName + " from " + className);
                Console.WriteLine("EXCEPTION OUTPUT\n" + ex.Message + "\n" + ex.InnerException);
                return;
            }
        
            // The first parameter to pass into the Invoke Method coming up.
            Object _InvokeParam1 = Activator.CreateInstance(_Type);
            //Object[] _Params = new Object[] { parameters };

            // This calls the target method ("DisplayMyself").
            //  NOTE: I'm not passing any arguments down to the method being invoked.
            //  Therefore, I'm passing null as my argument, otherwise Invoke takes an
            //  array of Objects.
            _MethodInfo.Invoke(_InvokeParam1, new Object[] { _parameters});
        }

I call this RunClass method from my Main method like this:

//_UserInputParam is a Console.ReadLine() object (In my testing I am passing '5' to this call).
_Main._ReflectMain.RunClass(_UserInputDLL, _UserInputClass, _UserInputMethod, Int32.Parse(_UserInputParam));

The class that is being called by the invocation of the reflection method call is set up like this:

public void DisplayMyself(params Object[] parameters)
        {
            if (parameters.Length <= 0)
            {
                Console.WriteLine("Hello! I am " + this.ToString());
                return;
            }
            Console.WriteLine("Parameter Found in: " + this.ToString() + "__ Param was: ");
            for (int i = 0; i < parameters.Length; i++)
            {
                Console.WriteLine(parameters[i]);
            }
        }

The error I'm receiving is:

Object reference not set to instance of an object. It occurs on the line

And it occurs on the line:

_MethodInfo.Invoke(_InvokeParam1, new Object[] { parameters });

Even though when debugging parameters, it has the object '5' within it (or whatever the user inputs into the console.readline (and outputted through int32.parse() call).


Any help/insight would be appreciated.

Thanks,
-Catch

Member Avatar
bodikon
Newbie Poster
12 posts since Jun 2006
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Hey man, I am having the same issue, if youknow of a solution let me know, otherwise i'll keep searching and let you know if I do :)

Member Avatar
Ramy Mahrous
Postaholic
2,189 posts since Aug 2006
Reputation Points: 401 [?]
Q&As Helped to Solve: 277 [?]
Skill Endorsements: 14 [?]
Featured
 
0
 

Please, send me your project on RamyMahrous@gmail.com I'll debug it and tell you the problem en shaa ALLAH

Member Avatar
floydus
Newbie Poster
8 posts since Dec 2006
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

I've been working with c# since only a year, but I figured this for a c# windows service I've made that calls a vb6 class object with no less then 52 arguments....

hope it will help someone.

using System;
using System.Reflection;

private Type ProgType =  Type.GetTypeFromProgID("myvb6dll.dvrObj");   // Assign Type to the Class Type
object o = Activator.CreateInstance(ProgType);
object returnValue;

// Create object that will holds arguments to pass to InvokeMember
// See VB6 Newobject project for list of arguments 
object[] arguments = new object[52];
arguments[0] = objectClass;
.......
.......
arguments[51] = objectVerifyThis;

returnValue = ProgType.InvokeMember("makeCall", BindingFlags.InvokeMethod, null, o, arguments);
resFonction = returnValue.ToString();

Let me know if it's clear enough...
Thanks.

You
This article has been dead for over three months: Start a new discussion instead
Post:
Start New Discussion
Tags Related to this Article