c #, interne et reflection

Existe-t-il un moyen d’exécuter du code “interne” par reflection?

Voici un exemple de programme:

using System; using System.Reflection; namespace ReflectionInternalTest { class Program { static void Main(ssortingng[] 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 création d’une classe de test fonctionne normalement parfaitement. Toutefois, lorsque j’essaie de créer une instance par reflection, une erreur missingMethodException m’indique qu’elle ne trouve pas le constructeur (ce qui se produirait si vous tentiez de l’appeler de l’extérieur de l’assembly).

Est-ce impossible ou y a-t-il une solution que je peux faire?

Voici un exemple …

  class Program { static void Main(ssortingng[] 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!") ; } } 

Basé sur les instructions de Preets à un autre poste:

 using System; using System.Reflection; using System.Runtime.ComstackrServices; namespace ReflectionInternalTest { class Program { static void Main(ssortingng[] 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); } } } 

Cela marche. (Ajout d’un argument pour prouver que c’était une nouvelle instance).

Il s’avère que j’avais juste besoin de l’instance et des BindingFlags non publics.

Utilisez l’encapsuleur dynamic AccessPrivateWrapper si vous êtes en C # 4.0 http://amazedsaint.blogspot.com/2010/05/accessprivatewrapper-c-40-dynamic.html