How to instantiate the class in an assembly using Reflection with C#/.NET?

11,185

Solution 1

object h = Activator.CreateInstance(asm.FullName, "MyClass.Calculator");

EDIT:

See if this works

Type calc = asm.GetType("MyClass.Calculator)";
object h  = Activator.CreateInstance(calc);

Solution 2

string path = Directory.GetCurrentDirectory();
string target = Path.Combine(path, @"./myclass.dll");
Assembly asm = Assembly.LoadFrom(target);
Type type = asm.GetType("MyClass.Calculator");
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
object calc = ctor.Invoke (null);
MethodInfo m = type.GetMethod("Add");

int res = (int) m.Invoke(calc, param);
Console.WriteLine("{0}", res);      
Share:
11,185
prosseek
Author by

prosseek

A software engineer/programmer/researcher/professor who loves everything about software building. Programming Language: C/C++, D, Java/Groovy/Scala, C#, Objective-C, Python, Ruby, Lisp, Prolog, SQL, Smalltalk, Haskell, F#, OCaml, Erlang/Elixir, Forth, Rebol/Red Programming Tools and environments: Emacs, Eclipse, TextMate, JVM, .NET Programming Methodology: Refactoring, Design Patterns, Agile, eXtreme Computer Science: Algorithm, Compiler, Artificial Intelligence

Updated on June 28, 2022

Comments

  • prosseek
    prosseek almost 2 years

    I have this library to compiled to calc.dll.

    namespace MyClass
    {
        public class Calculator
        {
            public int Value1 {get; set;}
            public int Value2 {get; set;}
            public Calculator()
            {
                Value1 = 100;
                Value2 = 200;
            }
    
            public int Add(int val1, int val2)
            {
                Value1 = val1; Value2 = val2;
                return Value1 + Value2;
            }
        }
    }
    

    I want to instantiate the Calculate class without linking to the calc.dll. Can C# do that? I came up with this code, but I don't know how to instantiate the Calculator class.

    using System;
    using System.IO;
    using System.Reflection;
    using System.Diagnostics;
    using System.Collections.Generic;
    
    namespace EX
    {
        public class Code
        {
            public static void Test()
            {
                string path = Directory.GetCurrentDirectory();
                string target = Path.Combine(path, @"./myclass.dll");
                Assembly asm = Assembly.LoadFrom(target);
    
                Calculator h = new Calculator(); // <-- ???
                Type type = h.GetType();
                MethodInfo m = type.GetMethod("Add");
    
                int res = (int) m.Invoke(h, param);
                Console.WriteLine("{0}", res);
            }
    
            public static void Main()
            {
                Test();
            }
        }
    }
    

    ADDED

    I have two solutions, one is from Bala R

            var param = new object[] {100, 200};
            string path = Directory.GetCurrentDirectory();
            string target = Path.Combine(path, @"./myclass.dll");            
            Assembly asm = Assembly.LoadFrom(target);            
            Type calc = asm.GetType("MyClass.Calculator");
            object h  = Activator.CreateInstance(calc);         
    
            MethodInfo m = calc.GetMethod("Add");            
            int res = (int) m.Invoke(h, param);            
            Console.WriteLine("{0}", res); 
    

    And this one is from agent-j

            string path = Directory.GetCurrentDirectory();
            string target = Path.Combine(path, @"./myclass.dll");
            Assembly asm = Assembly.LoadFrom(target);
            Type type = asm.GetType("MyClass.Calculator");
            ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
            object calc = ctor.Invoke(null);
            MethodInfo m = type.GetMethod("Add");
    
            var param = new object[] {100, 200};
    
            int res = (int) m.Invoke(calc, param);
            Console.WriteLine("{0}", res);
    

    Both of them are working, but I kinda prefer Bala's solution as it's shorter and getting object h through CreateInstance is more intutive than getting constructor to get object h(calc).