WinFuture-Forum.de: Zugriff Auf Private Funktion In .net - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Zugriff Auf Private Funktion In .net Brauche Hilfe zu C#!


#1 Mitglied ist offline   Legacy 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 19. Mai 05
  • Reputation: 0

  geschrieben 19. Mai 2005 - 20:28

Hallo Forum!

Mit meiner .NET Applikation möchte ich auf eine private Funktion einer anderen, bereits kompilierten .NET Komponente zugreifen. Ist das möglich?

Dieser Beitrag wurde von Legacy bearbeitet: 22. Mai 2005 - 17:08

0

Anzeige



#2 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 19. Mai 2005 - 20:45

Nur über Managed C++ bei der .NET CLR 2.0 oder geeignete Spielereien mit Native Code. Mir scheint aber, daß du das Konzept der privaten Funktionen nicht verstehen willst.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#3 Mitglied ist offline   Legacy 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 19. Mai 2005 - 20:51

@Rika Danke!
Die Komponente wurde noch mit .NET 1.1 erstellt. Müsste wegen 'nem Workaround darauf zugreifen.
0

#4 Mitglied ist offline   constructor 

  • Gruppe: aktive Mitglieder
  • Beiträge: 112
  • Beigetreten: 18. April 05
  • Reputation: 0

  geschrieben 20. Mai 2005 - 12:20

Och ... über Reflection funktioniert das ganz easy ;)

Hier mal ein Code Beispiel:
//Der Namespace System.Reflection wurde eingebunden!

//Assembly laden
	Assembly l_Assembly 
  = Assembly.LoadFrom(@"..\..\..\ClassLibrary6\bin\Debug\ClassLibrary6.dll");
	
	//Die Klasse, auf die zugegriffen werden soll, ermitteln
	Type l_Type = l_Assembly.GetType("ClassLibrary6.Class1");
	
	//Instanz der Klasse erstellen
	object l_Instance = Activator.CreateInstance(l_Type);
	
	//MethodInfo-Objekt für die gewünschte Funktion erstellen 
	//und Funktion in der KlassenInstanz über Invoke aufrufen
	MethodInfo l_MethodInfo = l_Type.GetMethod("ShowMessage", BindingFlags.Instance | BindingFlags.NonPublic);
	l_MethodInfo.Invoke(l_Instance, new object[]{"Hello Reflection World!"});


Beim Erstellen des MethodInfo-Objekts musst du darauf achten, dass BindingFlags.NonPublic übergeben wird!

Habe dir mal ein Beispielprojekt mitgeschickt.

RIP OOP ;)

Viel Spaß!

Angehängte Datei(en)


0

#5 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 20. Mai 2005 - 15:54

Mit /safe kompilierte private Functions reagieren auf Reflections? :lol:
Wat'n dat für 'n Murks?
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#6 Mitglied ist offline   constructor 

  • Gruppe: aktive Mitglieder
  • Beiträge: 112
  • Beigetreten: 18. April 05
  • Reputation: 0

  geschrieben 20. Mai 2005 - 17:57

Jep, ist schon interessant, was mit .NET so alles möglich ist :lol:

Um den obrigen Code auszuhebeln könnte man in der Komponente, in der sich die private Funktion befindet, einen private/internal Constructor einführen.
Das würde das Erstellen des Types über Reflection verhindern.

Aaaaaber:
In diesem Fall holt man sich über Reflection einfach den privaten (!!!) Constructor und erstellt mit dem die Klasseninstanz! :lol:

//Privaten Constructor ermitteln
ConstructorInfo l_ConstructorInfo = l_Type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[0], null);
object l_Instance = l_ConstructorInfo.Invoke(new object[0]);

//Methode aufrufen
MethodInfo l_MethodInfo = l_Type.GetMethod("ShowMessage2", BindingFlags.Instance | BindingFlags.NonPublic);
l_MethodInfo.Invoke(l_Instance, new object[]{"Hello Reflection World 2!"});


Schützen kann man sich dagegen imho nur mit declarative security und dem Attribut ReflectionPermissionAttribute. Im Betriebsystem läßt sich das ganze dann konfigurieren.

Diese Möglichkeiten hat sicherlich schon den ein oder anderen Script Kiddie oder echten Hacker/Cracker auf den Plan gebracht ;D Mit dem .NET-Framework 2.0 soll das aber wohl nicht mehr so einfach möglich sein.

Anbei noch das erweiterte Beispielprojekt.

Angehängte Datei(en)


Dieser Beitrag wurde von constructor bearbeitet: 20. Mai 2005 - 18:04

0

#7 Mitglied ist offline   Legacy 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 19. Mai 05
  • Reputation: 0

  geschrieben 21. Mai 2005 - 06:07

Danke, werde es gleich mal ausprobieren!
0

#8 Mitglied ist offline   Legacy 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 19. Mai 05
  • Reputation: 0

  geschrieben 22. Mai 2005 - 17:07

Sehr gut - es funktioniert!

Nun verzweifle ich an einem anderen Problem!

Die private Funktion befindet sich in einer Klasse, die von einem bestimmten Interface erbt. Leider ist nich klar, welche Klasse das ist. Es können auch mehrere Klassen von dem Interface geerbt haben.

Die Funktion "type.GetInterfaces()" gibt mir anscheinend nur die Interface-Implementierungen zurück.
Wie kann ich über Reflection feststellen, ob eine Komponente eine Klasse enthält, die von einem bestimmten Interface ERBT?

Dieser Beitrag wurde von Legacy bearbeitet: 22. Mai 2005 - 17:40

0

#9 Mitglied ist offline   Legacy 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 23. Mai 2005 - 21:21

push :D

Kann mir denn keiner helfen?
0

#10 Mitglied ist offline   constructor 

  • Gruppe: aktive Mitglieder
  • Beiträge: 112
  • Beigetreten: 18. April 05
  • Reputation: 0

  geschrieben 24. Mai 2005 - 09:41

Zitat (Legacy: 22.05.2005, 18:07)

Wie kann ich über Reflection feststellen, ob eine Komponente eine Klasse enthält, die von einem bestimmten Interface ERBT?
<{POST_SNAPBACK}>


Das ist imho etwas komplizierter:

Du benötigst einen System.Reflection.TypeFilter und eine zusätzliche Filterfunktion. Über eine Schleife gehst du dann alle Types der Komponente durch und überprüfst, ob der jeweilige Type von dem Interface erbt.


private static Type FindType()
{
    Assembly l_Assembly = Assembly.LoadFrom(@"c:\MeineKomponente.dll");
    Type l_AddInInfoType = null;
    foreach(Type type in l_Assembly.GetTypes())
    {
        //Überprüfen, ob der Type das Interface implementiert
        TypeFilter myFilter = new TypeFilter(InterfaceFilter);
        String[] myInterfaceList = new String[1] {"Namespace.IMeinInterface"};
        Type[] myInterfaces = type.FindInterfaces(myFilter, myInterfaceList[0]);
        if (myInterfaces.Length == 1)
        {
            l_AddInInfoType = type;
            break;
        }
    }
    
    return l_AddInInfoType;
}


private static bool InterfaceFilter(Type typeObj, Object criteriaObj)
{
    if(typeObj.ToString() == criteriaObj.ToString())
    {
        return true;
    }
    else
    {
        return false;
    }
}

0

#11 Mitglied ist offline   Legacy 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 19. Mai 05
  • Reputation: 0

  geschrieben 04. Juni 2005 - 13:37

Super - Danke!
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0