Nov 06 2009

Enumeration in einem WCF Service

Tag: .NETMichael @ 14:31

Um eine Enumeration in einem WCF Sefvice an den Client zu übertragen, muss das [ServiceKnownType(typeof(Enum))] Attribute in den Service Contract eingefügt werden:

namespace TestService.Interfaces
{
    [ServiceContract]
    [ServiceKnownType(typeof(MyEnum))]
    public interface ITestService
    {
        [OperationContract]
        ....
    }
}

Die Enumeration sieht dann so aus:

namespace TestService.Classes
{
 	[DataContract]
	public enum MyEnum
	{
		[EnumMember]
		Undefined = 0,

		[EnumMember]
		 Okay = 1,

		[EnumMember]
		Error = 2
	}

    [DataContract]
	public class MyClass
    {
		...
	}
}

Sep 11 2008

VB.Net Copy Listview to Clipboard

Tag: .NETMichael @ 8:51
Public Sub CopyListViewToClipboard(ByVal lv As ListView)
Dim buffer As New StringBuilder

For i As Integer = 0 To lv.Columns.Count - 1
buffer.Append(lv.Columns(i).Text)
buffer.Append(vbTab)
Next

buffer.Append(vbCrLf)

For i As Integer = 0 To lv.Items.Count - 1
For j As Integer = 0 To lv.Columns.Count - 1
buffer.Append(lv.Items(i).SubItems(j).Text)
buffer.Append(vbTab)
Next

buffer.Append(vbCrLf)
Next

My.Computer.Clipboard.SetText(buffer.ToString)
End Sub

Aug 29 2008

DvAPI EML-Export unter .Net

Tag: .NETMichael @ 12:20

Eigentlich sollte der Export einer DavidZehn Mail ins EML-Format dank der DvAPI kein großes Problem sein. Ein entsprechendes Beispiel gibt es sogar in der API Dokumentation:

Private Declare Function DVEmlFromMailItem Lib "DvApi32" (ByVal oMailItem As  DvApi32.MailItem, ByVal strFileName As String) As Long

Private Sub  eMail2eml_Click()
'Save all MailItems entries as .eml

Dim oApp As  DvApi32.IApplication
Dim oAccount As DvApi32.Account
Dim oArchive As  DvApi32.Archive
Dim oMailItem As DvApi32.MailItem
Dim oMessageItems As  DvApi32.MessageItems
Dim Filename As String
Dim i As Integer

Set  oApp = CreateObject("DVOBJAPILib.DvISEAPI")
Set oAccount = oApp.Logon("",  "", "", "", "", "AUTH")
Set oArchive =  oAccount.GetSpecialArchive(DvApi32.DvArchiveTypes.DvArchivePersonalIn)
Set  oMessageItems = oArchive.AllItems

For i = 0 To oMessageItems.Count - 1
If oMessageItems.Item(i).Type = DvApi32.DvItemTypes.DvEMailItem Then
oMailItem = oMessageItems.Item(i)
Filename = Space(260)
If DVEmlFromMailItem(oMailItem, Filename) <> 0 Then
' In  Filename are the saved EML file
FileCopy Filename, "c:\" & oMailItem.Subject & ".eml"
End If
End If
Next
End Sub

Aber leider funktioniert dieses Beispiel unter .Net nicht, denn die Funktion FileCopy wirft hier eine Exception “Illegales Zeichen im Pfad”.

Das Problem liegt in der Zeile “Filename = Space(260)“, welche die Variable mit 260 Leerzeichen initialisiert.
In diese Variable wird von der API der temporäre Filename der EML Datei geschrieben, aber die überzähligen Leerzeichen werden dabei nicht entfernt.

.Net kann diese Leerzeichen nicht verarbeiten und wirft eine Exception. Auch ein Trim(Filename) hilft nicht weiter.

Aber man kann den temporären Filenamen einfach zerlegen und schneidet damit alle Leerzeichen nach dem eigentlichen Filenamen ab:

For i = 0 To oMessageItems.Count - 1
If oMessageItems.Item(i).Type = DvApi32.DvItemTypes.DvEMailItem Then
oMailItem = oMessageItems.Item(i)
Filename = Space(260)
If DVEmlFromMailItem(oMailItem, Filename) <> 0 Then
' In  Filename are the saved EML file
Filename = Filename.Substring(0, Filename.LastIndexOf(".tmp") + 4)

FileCopy Filename, "c:\" &  oMailItem.Subject & ".eml"
End If
End If
Next

Ein weiterer Lösungsansatz wäre, mit der IWshRuntimeLibrary zu arbeiten, denn der CopyFile Befehl des FileSystemObject (IWshRuntimeLibrary.FileSystemObject()) stört sich nicht an den Leerzeichen:

For i = 0 To oMessageItems.Count - 1
If oMessageItems.Item(i).Type = DvApi32.DvItemTypes.DvEMailItem Then
oMailItem = oMessageItems.Item(i)
Filename = Space(260)
If DVEmlFromMailItem(oMailItem, Filename) <> 0 Then
Dim objFileSystemObject As New IWshRuntimeLibrary.FileSystemObject()

' In  Filename are the saved EML file
objFileSystemObject.CopyFile(Filename, "c:\" &  oMailItem.Subject & ".eml")
End If
End If
Next

Aug 07 2008

Tobit DavidZehn API unter .Net

Tag: .NETMichael @ 15:33

Die Tobit API steht zum aktuellen Zeitpunkt leider nur als COM DLL zur Verfügung.

Um trozdem vernünftig unter .Net damit arbeiten zu können benötigt man eine “Wraper” (runtime-callable wrapper / RCW) DLL. Ein solcher Wrapper wird manchmal auch ‘Interop” genannt. Glücklicherweise nimmt uns Microsoft die Erstellung einer solchen DLL ab.

Zum erstellen der “Wrapper” DLL bindet man einfach die ursprüngliche DVAPI32.DLL API in VisualStudio in das Projekt ein (Eigenschaften->Verweise) und VS erstellt eine neue Interop.DvApi32.dll.

Kann, oder möchten man VisualStudio nicht einsetzten, so bringt das .NET SDK auch ein Kommandozeilen Tool mit (TlbImp.exe), mit dem sich die Interop DLL erzeugen lässt.

Die Logik zum Erstellen des RCW Codes befindet sich in der .NET Klasse System.Runtime.InteropServices.TypeLibConverter.

Nun kann man auf alle Datentypen, Methoden, etc der Tobi DavidZehn API zugreifen.

Zwar lässt sich auch ohne Interop DLL mit der API arbeiten, in dem man alle Objekte als “Object” deklariert, aber einige Funktionen wie z.B. DVEmlFromMailItem arbeiten aus meiner Erfahrung wesentlich zuverlässiger, wenn sie mit den richtigen Datentypen aufgerufen werden.
Auch wird die Programmierung im VisualStudio durch die Integration der DLL Dank Intelisense und Co doch wesentlich komfortabler.