Search code examples
c#reflectioninternal

c#, Internal, and Reflection


Is there a way to execute "internal" code via reflection?

Here is an example program:

using System;
using System.Reflection;

namespace ReflectionInternalTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly asm = Assembly.GetExecutingAssembly();

            // Call normally
            new TestClass();

            // Call with Reflection
            asm.CreateInstance("ReflectionInternalTest.TestClass", 
                false, 
                BindingFlags.Default | BindingFlags.CreateInstance, 
                null, 
                null, 
                null, 
                null);

            // Pause
            Console.ReadLine();
        }
    }

    class TestClass
    {
        internal TestClass()
        {
            Console.WriteLine("Test class instantiated");
        }
    }
}

Creating a testclass normally works perfectly, however when i try to create an instance via reflection, I get a missingMethodException error saying it can't find the Constructor (which is what would happen if you tried calling it from outside the assembly).

Is this impossible, or is there some workaround i can do?


Solution

  • Based on Preets direction to an alternate post:

    using System;
    using System.Reflection;
    using System.Runtime.CompilerServices;
    
    namespace ReflectionInternalTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Assembly asm = Assembly.GetExecutingAssembly();
    
                // Call normally
                new TestClass(1234);
    
                // Call with Reflection
                asm.CreateInstance("ReflectionInternalTest.TestClass", 
                    false, 
                    BindingFlags.Default | BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, 
                    null, 
                    new Object[] {9876}, 
                    null, 
                    null);
    
                // Pause
                Console.ReadLine();
            }
        }
    
        class TestClass
        {
            internal TestClass(Int32 id)
            {
                Console.WriteLine("Test class instantiated with id: " + id);
            }
        }
    }
    

    This works. (Added an argument to prove it was a new instance).

    turns out i just needed the instance and nonpublic BindingFlags.