c #, interno, y reflexión

¿Hay una manera de ejecutar código “interno” a través de la reflexión?

Aquí hay un progtwig de ejemplo:

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"); } } } 

La creación de una clase de prueba normalmente funciona a la perfección, sin embargo, cuando bash crear una instancia a través de la reflexión, aparece un error MissMethodException que indica que no puede encontrar el Constructor (que es lo que sucedería si intentara llamar desde fuera del ensamblaje).

¿Es esto imposible, o hay alguna solución que puedo hacer?

Aquí hay un ejemplo …

  class Program { static void Main(string[] args) { var tr = typeof(TestReflection); var ctr = tr.GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[0], null); var obj = ctr.Invoke(null); ((TestReflection)obj).DoThatThang(); Console.ReadLine(); } } class TestReflection { internal TestReflection( ) { } public void DoThatThang() { Console.WriteLine("Done!") ; } } 

Basado en la dirección de Preets a una publicación alternativa:

 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); } } } 

Esto funciona. (Se agregó un argumento para probar que era una nueva instancia).

Resulta que solo necesitaba la instancia y BindingFlags no publicas.

Use el contenedor dynamic AccessPrivateWrapper si está en C # 4.0 http://amazedsaint.blogspot.com/2010/05/accessprivatewrapper-c-40-dynamic.html