Monthly Archives: October 2013

Kommunikation zwischen AppDomains

HostingCommunication

Slots

“..If you simply want to pass some serializable data (e.g. a string), you can share data using so called slots..”
(http://social.msdn.microsoft.com/Forums/vstudio/en-US/5821f52f-3272-4f97-97c7-1c698f30260a/communicate-between-app-domains)

static void Main()
{
AppDomain newDomain = AppDomain.CreateDomain ("New Domain");

// Write to a named slot called "Message"
newDomain.SetData ("Message", "guess what...");

// Executes the code in another application domain that is identified by the specified delegate.
newDomain.DoCallBack(SayMessage);
AppDomain.Unload (newDomain);
}

static void SayMessage()
{
// Read from the "Message" data slot
Console.WriteLine (AppDomain.CurrentDomain.GetData ("Message"));
}

(http://www.albahari.com/nutshell/ch21.aspx)

Remoting

“…If you created an object in another domain e.g. with AppDomain.CreateInstanceAndUnwrap, all you need to call the object in another domain is to call an object’s method. The simplest way to make a cross-application domain call is just to make a call directly on that object, which actually is exposed from another domain via its proxy, existing in another domain.”
(http://stackoverflow.com/questions/6242573/simplest-way-to-make-cross-appdomain-call)

static void Main()
{
AppDomain newDomain = AppDomain.CreateDomain ("New Domain");
Foo foo = (Foo) newDomain.CreateInstanceAndUnwrap (typeof (Foo).Assembly.FullName, typeof (Foo).FullName);
Console.WriteLine (foo.SayHello());
AppDomain.Unload (newDomain);
}

public class Foo : MarshalByRefObject
{
public string SayHello()
{
return "Hello from " + AppDomain.CurrentDomain.FriendlyName;
}

public override object InitializeLifetimeService()
{
// This ensures the object lasts for as long as the client wants it
return null;
}
}

WCF

“…The Windows Communication Foundation (or WCF), previously known as “Indigo”, is a runtime and a set of APIs (application programming interface) in the .NET Framework for building connected, service-oriented applications…”
(http://en.wikipedia.org/wiki/Windows_Communication_Foundation)

Evolution-of-WCF1
Evolution of WCF – Remoting vs. WCF (http://www.c-sharpcorner.com/UploadFile/370e35/evolution-of-wcf/)

Win8: Metro vs. Desktop

Für die IT-interessierte Gemeinde ein paar technische Infos zu Windows 8 (Stand Juni 2012):

Metro

  1. „Apps“ laufen auf einer eigene, auf nativem Code und einem überarbeiteten COM-basierende Klassenbibliothek (C++) mit Namen „Windows Runtime (WinRT)“.
    • Für x86, x64 und ARM Prozessoren
  2. Die Oberflächen (Views) erstellt man mit HTML/CSS oder XAML
    • „WinRT-Metro-XAML“ hat Abweichungen zu „Managed-WPF-XAML“!
  3. Die Programmierung erfolgt mit C/C++/C# und Visual Basic für XAML oder JavaScript für HTML/CSS
    • Die Klassen der Windows Runtime Library sind in weiten Teilen eine Untermenge der .NET-Klassen aus der .NET-Klassenbibliothek 4.0
    • Zugang zu Systemresourcen eingeschränkt (Sandbox-Konzept wie bei Silverlight)
    • Kein Managed Code, Kein WPF
    • Metro Apps kennen nicht das Konzept einer gemeinsamen Bibliothek (Shared Library), das heißt, jede Metro App muss ihre DLLs selbst mitliefern
  4. Eine dritte, im Bild nicht genannte Möglichkeit für Metro-Oberflächen ist die Verwendung von DirectX 11

Anmerkungen

  1. Bestehende .NET- und Silverlight-Anwendungen können nur mit einem nennenswerten Umstellungsaufwand (oder gar nicht) als Metro App laufen!
  2. Unternehmen, die Client-Anwendungen entwickeln, müssen also in Zukunft zwei Codebasen pflegen, wenn sie ihre Anwendungen sowohl für den klassischen Desktop als auch Windows 8 Metro anbieten wollen.
  3. Es ist zweifelhaft, ob sich typische Geschäftsanwendungen komplett in Metro abbilden lassen.
  4. Microsoft hat angekündigt, dass sich die kommenden Express-Ausgaben von Visual Studio 11 nur noch zur Entwicklung von Metro-Applikationen im Kacheldesign eignen sollen. Wer Desktop-Applikationen im gewohnten Fenster-Look programmieren will, muss sich eine kommerzielle (kostenpflichtige) Ausgabe der neuen Entwicklungsumgebung beschaffen oder bei Visual Studio 2010 (Express) bleiben. UPDATE: Mittlerweile gibt es eine Express-Version für Desktop-Anwendungen! Click me!

Desktop

  1. Anwendung erstellt man wie bisher mit der Win32-Bibliothek beziehungsweise MFC (Microsoft Foundation Class) oder mit Windows Forms beziehungsweise WPF (Windows Presentation Foundation) aus der .NET-Klassenbibliothek
  2. Mit Ausnahme der XAML-Oberflächenklassen sollen die WinRT-Klassen auch “klassischen” (d.h. nicht Metro-basierten) .NET-Anwendungen zur Verfügung stehen.

Quellen:
http://www.heise.de/developer/artikel/Windows-8-Apps-benoetigen-neue-Windows-Runtime-1344071.html (15.09.2011)
http://www.heise.de/newsticker/meldung/Build-Mit-Windows-Runtime-kehrt-Microsoft-zu-COM-zurueck-1344119.html (15.09.2011)
http://www.heise.de/newsticker/meldung/Visual-Studio-Express-nur-noch-fuer-Metro-1584234.html(25.05.2012)

windows8aufbau

Windows 8 User Experience Guidelines

Nicht nur dass das richtige Konzept für eine Oberfläche zu finden harte Arbeit ist, auch sind Softwareentwickler in der Regel nicht die besten Oberflächendesigner. Hierfür habe ich von Microsoft einen Lesetipp: Windows 8 User Experience Guidelines. Auf diesem 300 Seiten starken Dokument kann nachgelesen werden wie Fehlerfenster (S. 145), Logins (S. 152) u.v.m. aussehen können.

Viel Spass beim Schmökern!

Click me!

Die Zukunft von NHibernate?

Meine Meinung? Seid gewarnt, aber keine Panik!

by Jonathan Allen on Jun 20, 2013:
“…For many years NHibernate reigned as the premier ORM for the .NET framework and despite the successes of Entity Framework many people still consider it their first choice for new projects. But a lack of developers may severely hamper its future.
Currently there are only two significantly active developers, Alexander Zaytsev of Fourth Media and Oskar Berggren. They are making great strides in preparation for NHibernate 4 on .NET 4.0, but that doesn’t change the fact that .NET 4.0 was released over three years ago…”

Quelle: http://www.infoq.com/news/2013/06/NHibernate-Future

By Adam Bar on September 7, 2012:

“…NHibernate is a great tool, but time goes by pretty quickly. The context of our work changes from year to year and even good tools some day must be superseded by better ones, that are more suitable for nowadays needs. And I think that day for heavy, multi-purpose ORM’s like NHibernate has just come…”

Quelle: http://notherdev.blogspot.de/2012/09/is-nhibernate-dead.html

Changeset des TFS 2010 lokal zurücksetzen

Ist es einmal notwendig, die Auswirkungen eines fehlerhaften Changsets rückgängig zu machen, ist dieses wie folgt von hieraus möglich:

Visual Studio 2010 Command Prompt variables set.
PS D:\ProSharp\Resources> cd ..
PS D:\ProSharp> tf rollback /changeset:C3963
bearbeiten, Zurücksetzung: $/Schulz.ProControl3/Main/src/Schulz.sln;C3963~C3963 -> $/Schulz.ProControl3/Main/src/Schulz.sln;C
3963
bearbeiten, Zurücksetzung: $/Schulz.ProControl3/Main/src/Schulz.vsmdi;C3963~C3963 -> $/Schulz.ProControl3/Main/src/Schulz.vsm
di;C3963

Click me!

RollbackTFS

Hinweis: Ausgeführt innerhalb VS 2010 (siehe Post:”Command Prompt innerhalb Visual Studio IDE”)

Command Prompt innerhalb Visual Studio IDE

Während der Entwicklung wird immer wieder die Eingabeaufforderung benötigt (z.B. Build-Script ausführen). Um so lästiger ist der Wechsel zwischen IDE und VS Command Prompt. Hier wäre es schön, wenn das Command Prompt als “Dockable Tab” innerhalb der IDE zur Verfügung stehen könnte! Kein Problem:

1. Einen PowerShell-Host starten – z.B. die bereits installierte Paket-Manager-Konsole von NuGet.

2. VisualStudioCommand.ps1 ausführen (siehe weiter unten), um die Umgebungsvariablen und das Prompt zu setzen (ggf. Pfad nach Visual Studio anpassen)

PM> .\VisualStudioCommand.ps1

3. BuildDebug.bat, BuildRelease.bat, etc. ausführen

PowerShell01

Das PowerShell-Script:

function global:prompt
{
$(Get-Date).ToShortTimeString() + " " + $(get-location) + ">"
}

#Set environment variables for Visual Studio Command Prompt
pushd 'd:\Microsoft Visual Studio 10.0\VC'
cmd /c "vcvarsall.bat&set" |
foreach {
if ($_ -match "=") {
$v = $_.split("="); set-item -force -path "ENV:\$($v[0])" -value "$($v[1])"
}
}
popd
Clear-Host
write-host "`nVisual Studio 2010 Command Prompt variables set." -ForegroundColor DarkGreen