2

Ich lese this Buch über C# und .NET und ich lerne eine Menge coole Sachen. Ich habe den Teil gelesen, in dem der Autor über das dynamische Laden einer Assembly und das Erstellen einer Instanz eines Typs in dieser Assembly spricht.C# Assembly Loading und Late Binding

In AS3 ist es möglich, die gleiche Art von Sachen zu tun, mit einer Ausnahme: Sie können den Compiler bitten, nicht eine Klasse von Klassen zu kompilieren, sondern die Typsicherheit zu überprüfen. Hier ein Beispiel:

//Defined in an external library 
public class A {...} 


//In my application, I tell the compiler to type check A, but not compile it 
var a:A = new A(); 
a.whatever(); 

Zur Laufzeit in meinem Anwendungscode, kann ich dynamisch meine externe Bibliothek laden die Definition der Klasse A, laden diese Definitionen in meiner Anwendung Application und alles wird gut laufen. Keine Bedürfnisse der Reflexion!

Ist dies in C# möglich?

Mit anderen Worten, kann ich den C# -Compiler anweisen, gegen eine Reihe von Klassen (sagen wir, in einer Bibliothek) zu schreiben, aber sie von der Kompilierung ausschließen?

Antwort

1

ich nur read this

Action Script ist eine dynamische Sprache, bietet sie als „Sonderbonus“ -Funktion eine Typprüfung, es hilft Ihnen Fehler bei der Kompilierung, wie statische typisierten Sprachen tun fangen.

C# ist eine Static-typed-Sprache, die beim Compilieren alle Typen überprüft. Die Typprüfung ist kein "zusätzlicher Bonus", sondern ein integraler Bestandteil. C# war immer in der Lage, die Reflektion spät zu binden, und das Feature wird mit dem neuen dynamischen Keyword immer besser.

Wenn Sie jedoch eine der späten Bindungsfunktionen von C# verwenden, wird keine Typprüfung durchgeführt.

+0

Gut. Das ist interessant.In meinem Kopf war AS3 eine statische Sprache mit einigen dynamischen Eigenschaften. Ich weiß nicht, warum ich das dachte, denn es basierte auf ECMAScript, einer dynamischen Sprache. Ich denke, der Compiler macht einen wirklich guten Job, um ihn zu verstecken. Das erklärt eigentlich viele Dinge ... – subb

2

Ich bin nicht 100% klar, was der As3-Code tut - aber es klingt wie Sie eine gemeinsame Schnittstelle (in einer separaten DLL) definieren möchten, die Ihre externe Assembly implementieren kann - und einfach beim Erstellen erstellen das Objekt:

Type type = loadedAssembly.GetType(fullyQualifiedName); 
IMyInterface obj = (IMyInterface)Activator.CreateInstance(type): 

jetzt können Sie Methoden auf obj leicht definiert verwenden.

Alternativ bietet in C# 4.0 das Schlüsselwort dynamic Duck-Typisierung.

+0

Hinweis: Das dynamische Schlüsselwort ist etwas flexibler als die allgemeine Schnittstelle. Wenn Sie die Version auf der allgemeinen Schnittstelle ändern, müssen Sie entweder die Erweiterung und die Hauptanwendung neu kompilieren, oder Sie müssen sich umleiten der Resolver. –

+0

Ist das die Art, wie Sie eine Plugin-Schnittstelle machen würden? – subb

+0

Es ist in der Tat eine der häufigsten Optionen für eine Plugin-API. –