Feed
Contact
XING
LinkedIn
Twitter
ICQ
meebo.com

Visual Studio 2010 Black und die Probleme damit

by Roland Schumacher alias GENiALi 12. July 2010 -- 154 Wörter  -- 204 mal gelesen
Dieser Beitrag ist mir was wert:  

Microsoft veröffentlich ab und zu coole Erweiterungen für Visual Studio 2010. Zum Beispiel Visual Studio 2010 Pro Power Tools, die habe ich auch gleich installiert.

Aber auf etwas nimmt Microsoft meiner Meinung nach zu wenig Rücksicht. Auf Devs die ein Black Visual Studio haben. So wie ich. Nicht nur Microsoft hat da offensichtlich ein Problem. Auch JetBrains hat damit ein Problem. R# ergänzt das Farbschema um einige Positionen. Die machen bei einem Visual Studio Black vielfach keinen Sinn. Weisser Text auf weissem Hintergrund …

Das Problem mit der Microsoft Erweiterung zeigt sich wie folgt.

Wenn die Visual Studio 2010 Pro Power Tools aktiv sind …

Visual Studio 2010 Pro Power Tools aktiv

Wenn die Visual Studio 2010 Pro Power Tools inaktiv sind …

Visual Studio 2010 Pro Power Tools inaktiv

Was kann man nun besser lesen?

Vielleicht ist es ja auch nur eine Einstellungssache. Aber bei der Anzahl von möglichen Einstellungen wird man alt beim suchen der Richtigen.

Oder irre ich mich da? Funktioniert das ganze bei Anderen?

kick it on dotnet-kicks.de

Tags: , , ,

Entwicklung

Visual Studio 2010 und der Speicher (32-bit)

by Roland Schumacher alias GENiALi 15. June 2010 -- 253 Wörter  -- 395 mal gelesen
Dieser Beitrag ist mir was wert:  

Das ist so ne Sache. Auf 32-bit Systemen bekommt ein Prozess 2 GB virtuellen Speicher. Die sieht man im Taskmanager nicht, die sind nur virtuell. Normalerweise reicht das auch locker aus. Aber werden im Visual Studio 2010 mehrere AddIns oder Extensions installiert wird es schnell knapp.

Dann kann es vorkommen das plötzlich keine Code mehr kopiert werden kann, mit dem Hinweis, dass zu wenig Speicher vorhanden sei. Er sei zu fragmentiert und das kopieren scheitert dann. Wenn Visual Studio 2010 neu gestartet wird kann die selbe Stelle ohne Probleme kopiert werden. Bis es wieder … na ja.

Wenn es ganz schlimm kommt zeigt Visual Studio 2010 eine Meldung mit einem Link zu einer möglichen Lösung an.

Visual Studio 2010 – Low Virtual Memory

Dort wird schön beschrieben um was es geht. Eine Lösung ist, dass man dem Betriebssystem erlaubt mehr als die 2 GB einem Prozess zu geben. Mit 3072 MB wird die Obergrenze für einen Prozess auf 3 GB erhöht. Unter Vista, Windows 7 und Server 2008 muss man dazu im Bootmanager einen Eintrag anpassen.

bcdedit /set IncreaseUserVa 3072

Commandline (cmd.exe) als Admin starten und ausführen.

Commandline als Admin starten

bcdedit /set IncreaseUserVa 3072

Danach sind beide Fehler weg. Seit diesem Zeitpunkt bin ich nicht mehr auf das Problem vom Kopieren und der heftigen Meldung mit zu wenig Speicher gestossen. :-)

Aber eigentlich wollte ich das Posting schon lange schreiben da die originale Hilfeseite, die ich verlinkt habe, einen Fehler im bcedit Befehl hatte. Auf anderen Seiten fand ich damals den richtigen. In zwischen wurde der Schreibfehler bei IncreaseUserVa behoben.

kick it on dotnet-kicks.de

Tags: , , ,

Entwicklung

VS2010 – Testansicht fehlerhaft - B85579AA-8BE0-4C4F-A850-90902B317571

by Roland Schumacher alias GENiALi 26. May 2010 -- 113 Wörter  -- 259 mal gelesen
Dieser Beitrag ist mir was wert:  

Seit dem Update von Visual Studio 2008 auf 2010 kam es immer mal wieder vor das die Testansicht für die Unit Tests so aussah.

Testansicht fehlerhaft

Ich zweifelte natürlich an meiner Installation und ignorierte das. Als ich aber heute sah das die anderen Jungs auch noch das selbe Problem haben ging ich dem mal nach. Und siehe da, wir sind nicht die Einzigen.

Ein Grund kann sein das unter Extras –> Optionen –> Testtools eine Selektion falsch ist. Bei mir sah es wie folgt aus.

 Extras –> Optionen –> Testtools

Als ich dann dort etwas wählte funktionierte auch die Testansicht wieder einwandfrei.

VS2010 Testansicht die wieder tut

Fündig wurde ich hier: Test View Issue: An exception was encountered while constructing the content of this frame

kick it on dotnet-kicks.de

Tags: ,

Entwicklung | Software | Hilferuf und Lösung

.NET Object to VBScript to .NET

by Roland Schumacher alias GENiALi 14. May 2010 -- 899 Wörter  -- 387 mal gelesen
Dieser Beitrag ist mir was wert:  
Ausganslage

Zur Zeit arbeite ich an einem grossen Projekt wo wir eine VB6 Anwendung nach .NET (C#) migrieren. Im grossen und ganzen wird einfach die Logik migriert, ohne gross neue Funktionen hinzuzufügen.

In der alten Anwendung wurde zu Berechnungszwecken einiges an Logik in VBScripte ausgelagert. Das machte man, um die Logik anpassen zu können ohne das neue DLLs erstellt werden müssten. Das muss ich jetzt in C# nachbauen. Die VBScripte sollen noch nicht migriert werden. Schlicht vom Aufwand her.

Ich muss ein .NET Objekt an ein VBScript übergeben, das macht die Berechnungen und gibt danach das Objekt wieder an C# zurück.

Zuerst dachte ich, man könnte einfach WScript.exe mit ein paar Parametern aufrufen. Allerdings kann ich so natürlich keine Objekte übergeben. Nach einigem suchen wurde ich dann fündig wie dich ein .NET Objekt an ein VBScript übergeben kann und auch wieder zurück bekomme. Das Stichwort lautet: Microsoft Script Control 1.0

Was muss nun alles gemacht werden um das Problemchen zu lösen.

Erstellen eines COM Visible .NET Objektes

Um ein .NET Objekt in einer COM Umgebung zu bearbeiten muss das Objekt für COM Sichtbar gemacht werden. Das kann in der Projekteinstellung der Klassen gemacht werden.

COM Visible einstellen

COM Visible registrieren

Mit diesen Einstellungen wird das Objekt automatisch von Visual Studio als COM Registriert. Auf einem produktiven System müsste das natürlich das Setup übernehmen oder ein Batch. Mit regasm MyAssembly.dll wird die DLL auf der Commandline registriert oder aus einem Batch raus.

Die Klasse selber kann sehr einfach aussehen.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ComVisibleClass
{
	public class Person
	{
		private string m_Name;
		private string m_Vorname;
		private int m_Alter;
		public string Name
		{
			get{return m_Name;}
			set{m_Name = value;}
		}
		public string Vorname
		{
			get{return m_Vorname;}
			set{m_Vorname = value;}
		}
		public int Alter
		{
			get{return m_Alter;}
			set{m_Alter = value;}
		}
	}
}
Aufrufen des VBScriptes

Für den Test habe ich ein ganz einfaches VBScript erstellt. Es wird ein .NET Objekt übergeben und über eine MsgBox gibt es ein paar Meldungen zum Objekt. Somit ist klar das die Wert auch wirklich im VBScript manipuliert werden und auch wieder zurück ins .NET kommen.

Aber um ein VBScript auszuführen muss noch eine DLL eingebunden werden.

Microsoft Scripting Control 1.0

Unter Verweis hinzufügen wechselt man in das COM Register und sucht dort das Microsoft Scripting Control 1.0. Danach kann man auf das Control im Code zugreifen. Einfach noch das using hinzufügen wie in Zeile 6 im folgenden Code zu sehen.

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using ComVisibleClass;
using MSScriptControl;

namespace TestApp
{
	class Program
	{
		static void Main(string[] args)
		{
			StreamReader streamReader = new StreamReader("Script.vbs", Encoding.Default);
			string script = streamReader.ReadToEnd();
			streamReader.Dispose();

			RunScript(script);

			Console.ReadLine();
		}

		private static void RunScript(string scriptCode)
		{
			try
			{
				ScriptControlClass script = new ScriptControlClass();
				script.Language = "VBScript";
				script.Reset();
				script.AllowUI = true;
				script.UseSafeSubset = false;

				script.AddCode(scriptCode);

				Person person = new Person() { Name = "Schumacher", Vorname = "Roland", Alter = 35 };
				Console.WriteLine(person.Alter);

				script.AddObject("Person", person, true);

				Object[] objects = new object[] { };

				script.Run("CalculateStatus", ref objects);

				Console.WriteLine(person.Alter);
			}
			catch (COMException ex)
			{
				Console.WriteLine(ex.ToString());
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex.ToString());
			}
		}
	}
}

In den Zeilen 14 bis 16 wird ein VBScript geladen das im selben Verzeichnis liegt wie die Testanwendung. Das Script wird noch erläutert.

In Zeile 27 bis 42 findet die Ausführung des VBScriptes statt. Zuerst wird eine neue Instanz von ScriptControlClass erstellt und ein paar Parameter gesetzt. Mit script.AddCode übergibt man dem Control den Code den es ausführen soll. Achtung. Wenn das VBScript keine Sub oder Function enthält wird das Script schon in der Zeile 38 ausgeführt. Aber sobald das VBScript eine Function oder Sub enthält passiert in dieser Zeile noch nichts.

In Zeile 35 erstelle ich das Objekt das ich an das VBScript übergeben will. Man beachte das Alter. Das ist beim initialisieren auf 35 gesetzt. Zur Kontrolle gebe ich das in Zeile 36 aus.

In Zeile 38 übergebe ich das Objekt an das VBScript. Hier wird es auch wieder interessant. Im ersten Parameter geben ich eine Bezeichnung für das Objekt an. Genau mit dieser Bezeichnung greift man dann im VBScript auf die Person zu. In Zeile 42 wird schlussendlich die Funktion CalculateStatus() aufgerufen.

In Zeile 44 gebe ich nochmals das Alter aus. Und siehe da, es ist nicht mehr 35 sondern 99. Das alter 99 wurde im VBScript gesetzt. Der Informationsaustausch fand also statt. Ich kann ein .NET Objekt in VBScript manipulieren und die Ergebnisse stehen mir in .NET zur Verfügung.

Das VBScript

Das VBScript macht nicht viel spezielles.

Public Sub CalculateStatus()

    Dim oPerson
    set oPerson = Person

    if err.number <> 0 then
        MsgBox "UPS : Error " & Err.number & " Creating Customer: " & Err.description
    else
        MsgBox "Customer Name: " & oPerson.Name & " -- Vorname: " & oPerson.Vorname & " -- Alter: " & oPerson.Alter
        
        oPerson.Alter = 99
        
        MsgBox "Customer Name: " & oPerson.Name & " -- Vorname: " & oPerson.Vorname & " -- Alter: " & oPerson.Alter
    end if
End Sub

In Zeile 1 ist die Sub CalculateStatus definiert. In Zeile 3 definiere ich das Objekt oPerson und setze es in der Zeile 4. Und hier sieht man wieder die Person. Das ist genau die Person die man mit script.AddObject("Person", person, true);  übergeben hat.

In Zeile 9 wird die original Person kurz Visualisiert. Und Zeile 11 wird das Alter auf 99 gesetzt und in Zeile 13 wird die Person nochmals Visualisiert. Danach ist das VBScript fertig.

Im .NET ist das Alter der Person nun 99.

Result

Fazit

Was mir am Anfang als unlösbar mit .NET erschien ist im nachhinein sehr einfach zu lösen. Dank dem Internet und Google findet man irgend wann schon eine Lösung.

Jetzt gilt es nur noch ein Problem zu lösen. Die VBScripte müssen im Debugger gestartet werden können. Dazu gäbe es ja das Schlüsselwort stop im VB. Allerdings greift das nicht. Hier muss ich noch nach einer Lösung suchen was aber auch machbar sein wird.

Was noch cool wäre

So etwas sollte es auch mit C# als Script geben.

kick it on dotnet-kicks.de

Tags: , , , ,

Entwicklung

C# Merkzettel

by Roland Schumacher alias GENiALi 16. April 2010 -- 672 Wörter  -- 554 mal gelesen
Dieser Beitrag ist mir was wert:  

Sachen die immer mal wieder nützlich sein können.

1. Kalenderwoche eines Datum ermitteln.
private int KW(DateTime datum)
{
    CultureInfo cultureInfo = CultureInfo.CurrentCulture;
    int kw = cultureInfo.Calendar.GetWeekOfYear(datum, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return kw;
}
2. Ein einfaches Event erstellen.
public event EventHandler<EventArgs> DeletePersonEvent;
public void DeletePerson()
{
	if(DeletePersonEvent != null)
	{
		DeletePersonEvent(this, new EventArgs());
	}
}
3. WPF Zeilenumbruch in einer Caption oder Text Tag.
<TextBox x:Name="myTextBox" Text="Linie 1 &#x0a; Linie 2" />

Zeilenumbruch mit: &#x0a;

4. DataTable über WCF

Das geht nicht. Man darf es zuerst noch in ein DataSet verpacken und dann über WCF übertragen.

public DataSet GetPersonenDataSet()
{
    DataSet ds = new DataSet();
    ds.Tables.Add(m_PersonDao.Read());

    return ds;
}

m_PersonDao.Read() gibt ein DataTable zurück.

5. WPF Datenbindung

Auch immer mal wieder etwas was ich suche, obwohl es eigentlich sehr einfach ist.

Wahrscheinlich gibt es etwa 1000 Möglichkeiten wie man es lösen kann. Ich mache es zur Zeit so.

Code-Behind vom XAML:

public RaumView(RaumModel model)
{
    InitializeComponent();

    this.m_Model = model;

    this.DataContext = m_Model;
}

In Zeile 7 binde ich eine Klasse, die meine Objekte enthält, an den DataContext.

Danach kann ich auf den Controls relativ einfach die Daten binden.

Text="{Binding Raum.Standort.Bezeichnung, Mode=OneWay}"

In diesem Text wird eigentlich m_Model.Raum.Standort.Bezeichnung angezeigt. Das Feld wird aber nicht zurück in den DataContext synchronisiert (Mode=OneWay). Wenn das der fall sein soll, dann macht man das so.

Text="{Binding Raum.Bezeichnung, Mode=TwoWay}"

Die Bezeichnung des Raumes wird jetzt in den DataContext zurück synchronisiert (Mode=”TwoWay”).

So in etwa reicht es für mich zur Zeit aus.

6. GUID im Debugger ändern

Hat man mal das Bedürfnis eine Variable zur Laufzeit zu ändern, die vom Typ GUID ist, kann man nicht einfach die neue GUID im Debugger reinschreiben.

So sieht es zur Laufzeit aus.

Original GUID

Einfach neue GUID zwischen die {} kopieren resultiert in einem Fehler.

Fehler

Lösung:

Richtig gemacht

new Guid(“<GUID>”)

So sieht es danach aus.

neue GUID

7. Irgend eine Datei öffnen

Ich will eine Datei öffnen ohne das ich das Programm kennen muss was für die Datei nötig ist. Das geht natürlich nur wenn ein Haendler für die Datei auf dem System registriert ist. Und wenn, dann ist es einfach.

Process myProcess = new Process();
myProcess.StartInfo.FileName = "<PFAD_ZUR_DATEI>";
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();

Der FileName muss ein kompletter Pfad zu seiner Datei sein. z.B.: “c:\temp\MeinProgi\MeineDatei.txt

8. Eine E-Mail mit dem Standard E-Mail Programm öffnen.

Auch das kann mit der Process Klasse gemacht werden.

Process myProcess = new Process();
myProcess.StartInfo.FileName = string.Format("mailto:{0}", mailto);
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();

Und schon öffnet sich eine E-Mail mit seinem Standard E-Mail Programm. Aber das geht nur wenn auf dem System ein mailto Haendler registriert ist. Aber sobald ein E-Mail Klient installiert ist ist das der Fall. Wenn kein mailto Haendler vorhanden ist kann eigenartiges Passieren. Bei uns auf einem Windows XP startete danach ein paar 100 Mal der Internet Explorer. Wie so er so oft startete ist mir nicht klar. Aber danach gab es eine Klickorgie bis alle IE’s geschlossen waren.

Der mailto Haendler ist unter HKEY_CLASSES_ROOT\mailto zu finden. Das heisst, es muss auch etwas in der Form HKEY_CLASSES_ROOT\mailto\shell\open\command mit einem Eintrag vorhanden sein.

So kann auch eine URL mit dem Standardbrowser geöffnet werden. Dann gibt man bei FileName nur die URL an. http://…

9. WCF Klassen und ihre Konstruktoren

Ich wollte bei der Initialisierung einer neuen Klasse einen Wert erzwingen. Der soll immer gesetzt werden. Dazu habe ich einfach den Konstruktor überladen, dass heisst, keinen leeren mehr angeboten.

Danach wollte der Host nicht mehr starten. Aber die Fehlermeldung gab keinen Hinweis darauf. Auch war in den Tracelogs vom WCF kein Hinweis zu finden. Per Zufall habe ich dann einen Haltepunkt geschickt gesetzt und dort den Hinweis bekommen das die Klasse Serie nicht serialisiert werden kann. Da machte es klick.

Man merke sich. Klassen die über WCF übertragen werden sollen MÜSSEN einen default Konstruktor haben ohne Überladung.

10. WPF Dantenbindung zwischen Controls Eigenschaften

Na ja, ob hier der Titel passt?! Schauen wir mal.

Ich komme immer mal wieder an die Situation das ich Controls einschalten oder ausschalten soll, und das anhand eines anderen Controls. Z.B. Wenn RadioButton IsChecked=true ist, dann bist du eingeblendet. Das geht mit WPF auch erstaunlich einfach.

IsEnabled="{Binding ElementName=optMamUnten, Path=IsChecked}"

Binding ElementName gibt an welches Control man nutzen will. Mit Path wird dann noch gesagt auf welches Property man achten will. Sobald das RadioButton mit dem Namen optMamUnten IsChecked=true ist wird das Control eingeschaltet. So einfach kann es sein.

Gibt dann einen ganz schönen und einfach umzusetzenden Effekt.

Checked 1

Checked 2

kick it on dotnet-kicks.de

Tags: , , , , , , , ,

Entwicklung

Übersetzen

Diverses

Seitwert

Locations of visitors to this page

Rating
loading

Statistik