| Bernhard 的个人资料Bernhard Grojer - Blog照片日志列表 | 帮助 |
|
|
9月16日 System.Reflection, Properties mit einem bestimmten Typ schreiben
Die Klasse Customer ist hierbei wie folgt definiert:
Active, und IsNew würden in diesem Fall auf true gesetzt werden. FirstName wird ausgelassen.
5月31日 Windows Azure, Visual Studio 2010, Class Library (Klassen Biblioteken)Scheinbar gibt es unter Visual Studio 2010 bzw. den Windows Azure Templates ein Problem mit zusätzlichen "Projekten" in der Windows Azure Solution.
Fügt man eine neue (leere) Class Library zum Projekt hinzu und setzt Referenzen auf das Projekt kann man das Projekt nicht mehr bauen: ![]() Error 1 The OutputPath property is not set for this project. Please check to make sure that you have specified a valid Configuration/Platform combination. Configuration='Debug' Platform='AnyCPU' C:\Windows\Microsoft.NET\Framework\v4.0.20506\Microsoft.Common.targets 582 10 ServiceState Es hat sich danach rausgestellt, dass scheinbar in der Class Library (Klassen Bibliothek) nur Build-Einstellungen für x86 verfügbar sind. Dies dürfte das eigentliche Problem auslösen: ![]() Ich habe keine Möglichkeit gefunden dies in Visual Studio 2010 direkt zu ändern. Daher habe ich (manuel) die Projekt-Datei der Class Library bearbeitet: Die Visual C# Project file (.csproj) - original (nur x86 Build): <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">x86</Platform> <ProductVersion>10.0.20506</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{C4DA9B13-3879-4F55-8510-DE795CD4E9BE}</ProjectGuid> <OutputType>Library</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>ServiceStateLib</RootNamespace> <AssemblyName>ServiceStateLib</AssemblyName> <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> <PlatformTarget>x86</PlatformTarget> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <PlatformTarget>AnyCPU</PlatformTarget> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> ... Geändert auf (AnyCPU): <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProductVersion>10.0.20506</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>C4DA9B13-3879-4F55-8510-DE795CD4E9BE}</ProjectGuid> <OutputType>Library</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>ServiceStateLib</RootNamespace> <AssemblyName>ServiceStateLib</AssemblyName> <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> ... Danach neue einbinden und alles läuft wunderbar. Windows Azure - Visual Studio 2010Für Visual Studio 2010 gibt es seit kurzem das Windows Azure May CTP. Damit bekommt man nun auch Unterstüzung für VS 2010 und die passenden "Cloud Templates". Wahrlich hat man f. VS 2010 keine wirkliche Vorteile durchs neue Framework bei der Azure Entwicklung da .net 4.0 im Moment NICHT unterstützt ist unter Windows Azure. Da Visual Studio 2010 allerdings Multi-Targeting unterstützt können .net 3.5 SP1 Anwendung ohne Probleme erzeugt werden. 5月18日 Visual Studio 2010 - Beta1 (via MSDN)Visual Studio 2010 Beta 1 soll ab heute in via MSDN verfügbar sein! Im Moment ist noch nichts online (Stichwort Zeitverschiebung) 12月4日 Windows Live SkyDrive – 25 GB gratis
LINQ Provider - Vom Ausdruck zum Ergebnis - Teil 3
Nachdem wir im Teil 2 unsere Query<T> Klasse implementiert haben stehen wir nun vor unserem letzten Problem: den eigentlichen Provider für die Datenquelle Dieser muss:
Genau dafür haben wir bereits vorab die Idee geboren eine entsprechende Provider-Basisklasse zu erstellen, um später nur noch die die eigentliche Logik - Provider.Execute(…) – umzusetzen zu müssen. Daher implementieren wir im Provider die Funktionalität um eine Instanz von Query<T> zu bilden und diese zu retournieren (CreateQuery<>()). public abstract class QueryProvider : IQueryProvider { #region IQueryProvider Members public IQueryable<T> CreateQuery<T>(Expression expression) { return new Query<T>(this, expression); } public IQueryable CreateQuery(Expression expression) { throw new NotImplementedException(); } T IQueryProvider.Execute<T>(Expression expression) { return (T)this.Execute(expression); } object IQueryProvider.Execute(Expression expression) { return this.Execute(expression); } #endregion public abstract object Execute(Expression expression); } In der Basisklasse erzeugen wir außerdem eine abstrakte Methode “Execute” die unser eigentlicher Provider später implementieren muss. public class MyCustomProvider : QueryProvider { public override object Execute(Expression expression) { //Execute Query, Create return Value(s) } } Im vierten Teil der Serie werden wir uns eine Linq.Abfrage bereit legen und die Execute Methode in unsere konkrete Providerklasse implementieren. 10月7日 LINQ Provider - Vom Ausdruck zum Ergebnis - Teil 2
Zuerst beginnen wir nun die Funktionalitäten in Query<T> umzusetzen: public class Query<T> : IOrderedQueryable<T>, IQueryable, IOrderedQueryable { QueryProvider _Provider; Expression _Expression; public Query(QueryProvider provider) { this._Provider = provider; this._Expression = Expression.Constant(this); } public Query(QueryProvider provider, Expression expression) : this(provider) { this._Expression = expression; } //Implementierung der Interfaces ... } Bei der Implementierung des Interfaces machen wir nun nichts anderes als “jeweils” Provider.Execute(…) aufzurufen und diesen unsere Expression weitergereicht. public class Query<T> : IOrderedQueryable<T>, IQueryable, IOrderedQueryable { //... public IEnumerator<T> GetEnumerator() { var r = this.Provider.Execute<IEnumerable<T>>(this._Expression) as IEnumerable<T>; return r.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { var r = this.Provider.Execute(this._Expression) as IEnumerable; return r.GetEnumerator(); } //... } Und somit sind wir nun auch einem Geheimnis von LINQ auf die Schliche gekommen, weshalb Abfragen üblicherweise erst bei Zugriff ausgeführt werden. 10月3日 ADO.net DataServices
1) Erstellen einer neuen ASP.net Web Application 2) Ein ADO.net Entity Data Model erstellen (*.edmx) 3) Ein ADO.net Data Service hinzufügen und adaptieren. Imports System.Data.Services Imports System.Linq Imports System.ServiceModel.Web Public Class Northwind ' TODO: replace [[class name]] with your data class name Inherits DataService(Of NorthwindEntities) ' This method is called only once to initialize service-wide policies. Public Shared Sub InitializeService(ByVal config As IDataServiceConfiguration) ' TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc. ' Examples: ' config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead) ' config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All) config.SetEntitySetAccessRule("*", EntitySetRights.All) End Sub End Class Achtung das ADO.net DataService muss hierbei vom Context abgeleitet werden. 4) Testen des Services. –> F5 sollte hierfür reichen. Im einem zukünftigen Eintrag wollen wir das soeben erstellte Service noch konsumieren. Fragen dazu? Kommentar posten ;) 9月24日 LINQ Provider - Vom Ausdruck zum Ergebnis - Teil 1
... um zwischen der LINQ Engine und dem Datenspeicher unsere Logik implementieren. Doch leider ist die Aufgabe nicht ganz trivial und zwingt uns einige Tasks zu erledigen.
public class Query<T>: IOrderedQueryable<T>, IQueryable,IOrderedQueryable { QueryProvider _Provider; Expression _Expression; } public abstract class QueryProvider : IQueryProvider { } Query<T> bietet uns somit bereits eine generische Basis für die weitere Implementierung unserer Datenquellen. 8月7日 .net Framework 3.5 SP1 - RTM
7月18日 Parallel Extensions - June 2008 CTP
1: public List<int> GetPrimeNumbers(int lowerLimit, int upperLimit) 2: {3: var lst = new List<int>(); 4: for (int i = lowerLimit; i < upperLimit; i++) 5: {6: if (IsPrime(i)) 7: lst.Add(i); 8: }9: return lst; 10: } 11: 12: public bool IsPrime(int n) 13: {14: for (int i = 2; i < n; i++) 15: {16: if (n % i == 0) 17: return false; 18: }19: return true; 20: }Die Funktion GetPrimeNumbers gibt daraufhin alle Primzahlen retour. Allerdings - welche Überraschung - wird die Sache nur auf einen Kern ausgeführt. WIr verschenken daher auf Dual Cores bereits 50% Leistung. 1: public List<int> GetPrimeNumbersParallel(int lowerLimit, int upperLimit) 2: {3: var lst = new List<int>(); 4: Parallel.For(lowerLimit, upperLimit, delegate(int i) 5: {6: if (IsPrime(i)) 7: lst.Add(i); 8: } 9: ); 10: 11: return lst; 12: }In Zeile 4 verwenden wir nun die Prallel.For Methode (System.Threading) der Parallel Extensions und somit haben wir einen Methode entwickelt die all unsere Kerne nutzt ohne uns zu (manuellen) Threading zu zwingen. 1: Stopwatch sw;2: var pn = new PrimeNumber(); 3: var startNumber = 2; 4: var endNumber = 500000; 5: 6: sw = Stopwatch.StartNew(); 7: var res1 = pn.GetPrimeNumbers(startNumber, endNumber);8: Console.WriteLine("Done Seq: {0}", sw.ElapsedMilliseconds); 9: 10: sw = Stopwatch.StartNew(); 11: var res2 = pn.GetPrimeNumbersParallel(startNumber, endNumber);12: Console.WriteLine("Done Parallel: {0}", sw.ElapsedMilliseconds); Wir müssen beim Aufruf selbst nichts mehr beachten. Das Ergebnis kann sich sehen lassen würde ich sagen. 7月15日 C# 4.0Erstes Infos vom Team zu C# 4.0 gibts auf Channel9. Anders Hejlsberg (Wer? Sie wissen schon: Pascal, Delphi, C#, LINQ, ... - irgendwer muss sich das ja ausgedacht haben) und der Rest vom C# Team erzählen ein bisschen über die Zeile die Microsoft für C# 4.0 hat. 5月13日 .net Framework 3.5 - Beta1
2月13日 VSONE - Soeben meine beiden Talks erledigt
1月29日 Visual Studio 2008 - Nun auch in Deutsch!
|
|
|