Forum: PC-Programmierung Zugriffsmodifizierer in C#


von Roger (Gast)


Lesenswert?

Hallo,

ich habe ein Verständnisproblem mit Zugriffsmodifizierern...
Mal angenommen, ich erstelle ein neues Projekt...
1
namespace TestApp {
2
    public partial class Testfenster : Form {
3
  }
4
}

Soweit ich das verstanden habe, kann ich durch "public" von jeder 
anderen Klasse aus, die ich in meiner Anwendung erstelle, ohne 
Restriktionen auf die Klasse "Testfenster" zugreifen.

Ist durch Public nun aber theoretisch auch ein Zugriff von "Außen" 
möglich, also von völlig anderen Anwendungen, die sonst noch unter 
Windows laufen?

Falls ja, wie gelangen die denn an die Instanzen, die zur Laufzeit 
erzeugt werden?

Es geht mir um die Frage, ob man die Klassen bzw. die Daten in 
Programmen vor anderen Programmen bei Bedarf schützen sollte, oder ob 
Windows schon von Haus aus die Anwendungen voneinander abschottet(wobei 
Cracker vermutlich eh an alle Daten gelangen werden, wenn sie es denn 
möchten)?
Die Frage kam auf, weil ich in den Zugriffsmodifizierern etwas von 
"internal" gelesen habe und dort von der "gleichen Assembly" gesprochen 
wurde. Wenn ich das richtig verstanden habe, ist eine Assembly quasi so 
etwas wie das in Visual Studio erstellte Projekt bzw. die darin 
erstellten Programm-Bestandteile. Wenn ich nun "public" von "internal" 
abgrenzen möchte, muss es da ja noch mehr geben, als nur den Zugriff 
innerhalb meines Projekts. Kann mir das jemand verständlich erklären?

Guts Nächtle,
Roger

von Borislav B. (boris_b)


Lesenswert?

Roger schrieb:
> Ist durch Public nun aber theoretisch auch ein Zugriff von "Außen"
> möglich, also von völlig anderen Anwendungen, die sonst noch unter
> Windows laufen?

Ja, so ist es.

Roger schrieb:
> Falls ja, wie gelangen die denn an die Instanzen, die zur Laufzeit
> erzeugt werden?

Da läuft in etwa so:
Eine andere Anwendung kann deine Assembly (egal ob exe oder dll) 
dynamisch zur Laufzeit laden, und per Reflection schauen, welche Klassen 
darin enthalten sind. Nun kann die Anwendung diese nach Herzenslust 
selber instanziieren.

Eine andere Möglichkeit ist, dass ein anderes Projekt deine DLL zur 
Entwicklungszeit als Referenz nutzt. Hier können dann auch alle Typen, 
die als public markiert sind, verwendet werden.

von Markus (Gast)


Lesenswert?

Hi Roger,

Du brauchst Dir keine Gedanken darüber machen, dass andere Prozesse zur 
Laufzeit auf public-Daten-Elemente Deines Programms zugreifen können. 
Windows bzw. sogar die CPU sorgen für eine Abschottung.

Anders sieht es natürlich mit dem Programmcode aus. Dort kann jede 
Applikation Deine Assemblies laden und verwenden.

Grüße
Markus

von taubenhaucher (Gast)


Lesenswert?

Vielleicht noch interessant: Du kannst Typen als internal deklarieren, 
sie aber trotzdem in anderen Assemblys benutzen, die du per 
"InternalsVisibleTo" aufführst. Das wird typischerweise beim 
Unit-Testing verwendet (du entwickelst z.B. eine DLL A und 
implementierst die Tests in Assembly B, willst aber keine für den Client 
nutzlosen Klassen aus A public machen, diese aber in B testen).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.