| 

.NET C# Java Javascript Exception

3
Hallo zusammen,

ich möchte, dass meine Exports nur innerhalb meiner Assembly importiert werden können. Andere sollen auch von anderen Assemblies importiert werden können. Geht das und wenn ja, wie?

Besten Dank
News:
28.07.2011
Gast
31 2
1 Antwort
1
Auf die schnelle fallen mir da nur selbstgestrickte Möglichkeiten ein, die allerdings nicht sonderlich schön und auch nicht sonderlich sicher sind.

Die einfachste Möglichkeit ist festzustellen, wer die Assembly geladen hat (System.Reflection.Assembly.GetEntryAssembly). Dazu muss aber die "Export-Assembly" etwas (wenigstens den Namen) von der Assembly wissen, die diese laden darf.

Andere Möglichkeit wäre ein Schlüsselaustausch o.ä.. Auch das ist nicht sicher (zumal es ja noch ILSpy gibt), kann aber in der Richtung verbessert werden.

public delegate int CalculateSecret( int key, int hash );

[Export]
public class Test {
[ImportingConstructor]
public Test( [Import( "SecretMethod", AllowDefault = true )]CalculateSecret calc ) {
int key = DateTime.Now.Second;

if( calc != null && calc( key, 21 ) == key % 21 ) {
_value = "congrats";
} else {
_value = "wrong secret";
}
}

private string _value;
public string Value {
get {
return _value;
}
}
}


class Container {
[Export( "SecretMethod" )]
public int CalcPwd( int key, int hash ) {
return key % hash;
}

[Import]
public Test TestInstance { get; set; }
}


Das ImportingConstructor-Attribut gibt an, dass die Parameter importiert werden müssen. Dies wird nochmal durch das Import-Attribute verdeutlicht (und genauer definiert). Das ist ein delegate-Typ. AllowDefault steht auf true, damit es keine Fehlermeldung bei fehlendem Export gibt.

Die Container-Klasse Importiert die Test-Klasse und Exportiert die "geheime" Funktion ;)

Fehlt die Funktion oder gibt sie einen falschen Wert zurück, wird "wrong secret" in die Variable _value geschrieben...

Das geht auch mit Metadaten und Lazy<>... Aber Metadaten wären fest. Der delegate-Funktion können beliebige Werte mitgegeben werden..
28.07.2011
WolfgangKluge 1,0k 2 7
Danke Wolfgang. Wie du selbst sagtest nicht die schönste Art. Ich denke mir nur, dass ich ja nur ein paar Export Schnittstellen für andere freigeben möchte. Intern möchte ich aber MEF weiter für IoC nutzen. Hätte gedacht, dass soetwas schon mit dabei ist.
KCT 28.07.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH