| 

.NET C# Java Javascript Exception

4
Eigentlich meine ich, mich mit den Innereien von .NET ganz gut auszukennen, aber heute war ich dann doch etwas verblüfft. Ich hatte in C# einen kleinen Wrapper um eine COM-Komponente geschrieben und dabei auch Gebrauch vom dynamic-Schlüsselwort gemacht. Dann mußte ich feststellen, dass meine Rahmenbedingungen den Einsatz der 4.0er .NET-Runtime nicht zulassen (Details siehe unten). Also zähneknirschend ein neues Projekt mit .NET 3.5 als Target angelegt, meinen Code rüberkopiert (war nur eine Klasse) und F6 gedrückt in der Erwartung, dass der Compiler mir gleich sagen würde, wo ich überall "dynamic" ausbauen muß. Doch nichts dergleichen, der Code kompilierte und lief auch wie gewünscht.

Wie kann das sein? Ich dachte, dynamische Typen wären ein .NET-4.0-Feature?

Bezieht sich die Target-Plattform in meinem VS-Projekt nur auf die CLR, aber nicht auf die DLR? Kann die 2.0er CLR mit der DLR zusammenarbeiten?

Für mich am wichtigsten: wo wird meine Klasse laufen? Ich nehme an, überall wo .NET 4.0 installiert ist, oder (.NET-Target-Plattform hin oder her...)?

Als Hintergrundinfo: die Klasse ist zum Aufruf aus Matlab heraus vorgesehen. Dieses Tool kann .NET-Klassen aufrufen. Allerdings lädt es schon beim Start mscorlib und die System.dll, anscheinend in der 2.0er-Version. Assemblies zu entladen ist nicht möglich. Deshalb nehme ich an, dass ich dadurch auf die ältere Runtime festgelegt bin. Jedenfalls bekam ich zunächst die Meldung, dass meine Assembly für eine andere Runtime erstellt wäre als die gegenwärtig geladene und deshalb nicht ausgeführt werden könne. Das war der Grund für die Umstellung.
News:
04.11.2011
Matthias Hlawatsch 13,2k 4 9
2 Antworten
2
Hast du in deinem Programmbeispiel die dynamic Variabalen nur deklariert bzw. zugewiesen?

Der Kompiler erlaubt dir auch unter .Net 3.5 das deklarieren und zuweisen von Werten in dynamic Variablen. Sobald du die dynamic Variable aber wirklich benutzen willst ( z.B. Console.WriteLine(d) im Beispiel aus der ersten Antwort) erscheint die Fehlermeldung. Der Compiler generiert nur bei der Benutzung der Variablen Code um dem Typ der dynamic Variable zu ermitteln und dieser generierte Code benötigt Klassen aus .Net 4.0, daher erzeugt er auch erst dann eine Fehlermeldung.
06.11.2011
Baugber 36 1
So ist es: Variable deklariert, null zugewiesen, als Parameter an die COM-Komponente übergeben, danach variable gecastet. Mehr war da nicht.
dynamic hatte ich ursprünglich gewählt, weil ich mir nicht sicher war, was da eigentlich genau zurückkommt. Die COM-Komponente verlangt an der Stelle einen Pointer auf Variant. Nachdem es funktionierte, hab ich das nicht nochmal hinterfragt. Tatsächlich reicht es aber hier aus, die Variable als object zu deklarieren.

Gratulation zu dem guten Spürsinn, danke für die Antwort, und herzlich willkommen bei codekicker!
Matthias Hlawatsch 07.11.2011
1
Kann ich nicht nachvollziehen!
Ich habe hier VS2010, erstelle ein neues Consolenprojekt mit Target-Framework 4.0
Von der MSDN kopiere ich folgenden Beispielcode:
dynamic d;
int i = 20;
d = (dynamic)i;
Console.WriteLine(d);

string s = "Example string.";
d = (dynamic)s;
Console.WriteLine(d);

DateTime dt = DateTime.Today;
d = (dynamic)dt;
Console.WriteLine(d);

Programm läuft.

Bei den Projekteigenschaften ändere ich Target-Framework auf 3.5.
Nach einem Rebuild erhalte ich folgenden (richtigen) Compilerfehler,
One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll?

da dynamic die Microsoft.CSharp.dll benötigt und diese erst ab dem Framework 4.0 enthalten ist.
Somit scheint hier alles ok zu sein.
04.11.2011
Jürgen Luhr 7,1k 1 9
So hatte ich es auch erwartet. Am Montag poste ich mal meinen Code, hab hier daheim keinen Zugriff darauf. Für's erste schon mal danke!
Matthias Hlawatsch 05.11.2011

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