Tanpohp

HowTo

Simple Mocking – Framework zum erstellen von Mocks

by on Apr.14, 2014, under Test

Seit einiger Zeit beschäftige ich mich etwas mehr mit Unittest, vor allem auf Basis von NUnit. Unittest typisch sollen in jedem Fall nur einzelne Klassen getestet werden, um sehr genau Eingabewerte festlegen und Ausgabewerte überprüfen zu können. Leider gibt es immer wieder Konstellationen, in denen Klassen von anderen Klassen abhängig sind, was deren unabhängigen Test nahezu unmöglich macht. Um diesem Umstand zu begegnen werden die Abhängigkeiten durch Schnittstellen gekapselt und entsprechende Mocks geschrieben, die genau definierte Werte an die Klasse liefern. Im Folgenden ein Beispiel, in dem eine User-Factory ein IUser erstellen soll, dessen Daten diese von einem IDataReader bekommt.

public interface IUser{
    string Name {get;}
    string City {get;}
    int Age {get;}
}
public interface IDataReader{
    int GetInt32Value(string id);
    short GetInt16Value(string id);
    string GetStringValues(string id);
    ...
    Vector4 GetVector4(string id);
    ...
}
public static class UserFactory{
    public static IUser CreateFromDataReader(IDataReader reader){
        ...
    }
}

Anstelle der statischen Factory hätte man hier auch das Pattern Abstrakt Fabrik anwenden können und das IDataReader Interface hätte womöglich auch besser gestallten werden können. Angenommen dies wäre die Ausgangssituation und ich möchte die CreateFromDataReader Methode mit verschiedenen Usern prüfen. So müsste ich für jeden Test, einen Mock schreiben welche das IDataReader Interface implementiert und mir genau definierte Werte liefert. Wie die Definition des Interfaces schon andeutet, hat der IDataReader sehr viele Methoden, die zwar nicht benötigt würden, aber dennoch (zumindest leer) implementiert werden müssten.  Sehr viel sich wiederholende Arbeit.  Eigentlich wäre an dieser Stelle nur notwendig,  zwei der vielen Methoden zu implementieren:

string GetStringValue(string id);
int GetInt32Value(string id);

Um diesen Missstand zu begegnen gibt es zwei Möglichkeiten.

  1. Man benutzt Codegeneratoren um all die Methoden zumindest leer generieren zu lassen. Dann werden nur die Teile implementiert, die tatsächlich notwendig sind.
  2. Man nutzt Mocking-Frameworks, welche die Methoden implementieren und nur noch angepasst werden müssen.

Die erste Variante hat gravierende Nachteile: Zum Einen  gibt es eine Menge Code der nicht benötigt wird, aber im Falle eines Fehlers gelesen werden muss, zum Anderen ist es damit nicht Möglich das AAA-Test Pattern (Arrange, Act, Assert) umzusetzen.
Anhand von Simple.Mocking soll deshalb die zweite Methode vorgestellt werden. Dazu müssen wir einige Dinge über das Verhalten von UserFactory wissen:

  1. Alle Daten im späteren IUser Objekt sollen aus dem IDataReader kommen.
  2. Der IDataReader hat sein Daten aus einer anderen Datenquellen (z.B. Datenbank). Die Daten sind über die 3 Ids name, age und city ansprechbar.
  3. Die Reihenfolge in welche die Daten vom IDataReader abgefragt werden, spielen keine Rolle. (Bei einer Deserialisierung aus einer Datei ist die Reihenfolge wichtig und könnte ebenfalls mittels Simple Mocking festgelegt werden.)

Daraus kann nun folgender Test erstellt werden:

[Test]
public class UserFactoryTest {
   [Test]
   public void TestCreateUserFromDataReader(){
       //Arrange
       var userDataReader = Mock.Interface<IDataReader>(); 
       Expect.MethodCall(()=> userDataReader.GetStringValue("name").Return("John");
       Expect.MethodCall(()=> userDataReader.GetStringValue("city").Return("Bahia");
       Expect.MethodCall(()=> userDataReader.GetInt32Value("age").Return("35"));
       //act
       var user = UserFactory.CreateFromUserDataReader(userDataReader);
       //assert
       Assert.Equals("John", user.Name);
       Assert.Equals("Bahia", user.City);
       Assert.Equals(35, user.Age);
   }
}

Als erstes wird der Mock definiert:

var userDataReader = Mock.Interface<IDataReader>();

Im Anschluss werde die einzelnen Methoden-Aufrufe in definiert:

  1. Welche Methode wird aufgerufen.
  2. Welcher Parameter hat die Methode.
  3. Welchen Rückgabewert soll bei dieser Methoden geliefert werden.

Die Definition eines Mock beschränkt sich dadurch auf genau die Methoden, welche ich im Test auch tatsächlich benutzen möchte. Die Verwendung nicht gemockter Methoden erzeugt eine ExpectationException, ebenso wie das aufrufen der gemockten Methoden mit anderen Parametern.

Darüber hinaus bietet Simple Mocking noch einige mehr Features.

  • Prüfen der Reihenfolge von Aufrufe von Methoden/Properties.
  • Prüfen mittels Wildcard Paramtern: Any<T>.Value.Matching(a => Predicate(a))
  • Limitierung der Anzahl von Aufrufen.
  • Definieren von Exceptions die geworden werden.
  • Mocken von Interfaces, Delegaten.

Weitere Information im Getting-Startet Teil des Projektes.

Comments Off on Simple Mocking – Framework zum erstellen von Mocks :, more...

Schlüsselwörter für Suchmaschinen definieren

by on Jan.08, 2011, under ByTheWay, HowTo

Viele Browser bieten die Möglichkeit Schlüsselwörter für diverse Suchmaschienen zu definieren. Während dies bei Firefox sehr einfach zu erstellen ist, indem man einfach das Kontextmenu eines Suchfeldes öffnet, sammlt Chrome diese Adressen automatisch bei deren Benutzung. Leider sammelt es nicht alle. Des Weiteren benutze ich für manche Suchmaschinen mehrere Schlüsselwörter. Hier eine Liste:

Kürzel Url Beispiel Ergebnis
a http://www.amazon.de/s/ref=nb_sb_noss?field-keywords=%s”>a Was macht das Licht wenn es dunkel ist? a Was macht das Licht wenn es dunkel ist? Suche nach “Was macht das Licht wenn es dunkel ist?” in amazon.com
ask http://de.ask.com/web?q=%s a WordPress Suche nach “WordPress” in ask.com
b http://www.bing.com/search?setmkt=de-DE&q=%s b WordPress Suche nach “WordPress” in bing.com
dict http://www.dict.cc/?s=%s dict Tafel Schlägt “Tafel” auf dict.cc nach
dhl http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=de&idc=%s dhl 016022541887 Ruft die Sendeverfolgung für Paket 016022541887 bei DHL auf
e http://shop.ebay.de/?_nkw=%s e Laser-Mause Suche nach “Laser-Maus” in der ebay.de
f http://www.facebook.com/search/?src=os&q=%s f David Störmer Suche nach “David Störmer” in Facebook
g http://www.google.de/search?sourceid=chrome&ie=UTF-8&q=%s g WordPress Suche nach “WordPress” in google.de
geiz http://geizhals.at/deutschland/?in=&fs=%s geiz Lenovo W510 Suche nach “Lenovo W510” in dem deutschen teil von geizhals.at
gc http://www.google.com/images?q=%s&um=1&hl=de&uss=1&ie=UTF-8&source=og&sa=N&tab=wi gc WordPress Suche nach “WordPress” in google.com
geoip http://www.geoiptool.com/de/?IP=%s geoip www.htw-berlin.de Zeigt den Standort des Server der HTW Berlin in geoiptool.com auf einer Karte.
gp http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=%s gp WordPress Suche nach “WordPress” in den Bildern von google.com
if http://www.iconfinder.net/search/?q=%s if file Suche nach “file” in den Icons von iconfinder.com
kino http://kino.to/Search.html?q=%s kino Inception Suche nach “Inception” auf kino.to
leo http://dict.leo.org/ende?lp=ende&lang=de&searchLoc=0&search=%s leo Suchmaschine Suche nach der Übersetzung von “Suchmaschine” bei dict.leo.org
lfm http://www.last.fm/search?q=%s lfm Bela b. Suche nach “Bela B.” in last.fm
lmgtfy http://letmegooglethatforyou.com/?q=%s lmgtfy Watchman Suche nach “Watchman” in LetMyGoogleThatForYou
pr http://www.preisroboter.de/search.php?search=%s pr Benq FullHd Suche nach “Benq FullHd” in der Preissuchmaschine preisroboter.de
turl http://tinyurl.com/create.php?source=indexpage&url=%s&submit=Make+TinyURL! turl http://blog.tanpohp.de Erstellt eine kurze Url für http://blog.tanpohp.de
ups http://wwwapps.ups.com/WebTracking/track?HTMLVersion=5.0&loc=de_DE&Requester=UPSHome&
WBPM_lid=homepage/ct1.html_pnl_trk&
trackNums=1Z4V24Y06843238211%0D%0A&track.x=
Status+ermitteln
ups 1Z4V24Y06843238211 Ruft das Tracking zu dem Paket 1Z4V24Y06843238211 auf
vw http://www.videoworld.de/39—-filiale–sortiment–sortiment_liste.html?titel=%s&media=dvd vw Ruft das Tracking zu dem Paket 1Z4V24Y06843238211 auf
yt http://www.youtube.com/results?search_query=%s&page={startPage?}&utm_source=opensearch yt Led Lichtschranke Suche nach “Led Lichtschranke” in youtube
ytp https://youtubeproxy.org/default.aspx?prx=%s ytp http://www.youtube.com/watch?v=5ZMylpizXWY Leitet das Video http://www.youtube.com/watch?v=5ZMylpizXWY um
ytt http://www.youtube.com/results?search_query=%s+trailer ytt Watchmen Leitet das Video http://www.youtube.com/watch?v=5ZMylpizXWY um

Selbstverständlich können die Schlüsselwörter beliebig vergeben werden, wem also “bing.com” lieber ist als “b”, kann diese beliebig ändern. Das Beispiel der Suche nach Trailern bei youtube (ytt) zeigt, das es auch einfach möglich ist eigene Wörter in die Suchabfrage einzubringen.
Grundsätzlich sieht eine solche Url immer wie folgt aus:

     www.server.com/search?KeyDerSuche=%s als search

Der KeyDerSuche ist bei jeder Suchmaschine anders. Wichtig ist hier nur das %s vom Broweser durch den Suchtext ersetzt wird. Bsp:

     search Wikipedia wird im Browser www.server.com/search?KeyDerSuche=Wikipedia

Möchtet man eigene Wörter ergänzen, muss man diese nur vor oder nach %s ergänzen. Leerzeichen werden in Urls durch ein + gekennzeichnet.

     www.server.com/search?KeyDerSuche=%s+News

Comments Off on Schlüsselwörter für Suchmaschinen definieren more...

HowTo: Embedded Resource aus XAML und C# nutzen

by on Apr.18, 2010, under HowTo, MicroMite

Bilder und weiteren Inhalt in eine EXE einzubinden und zu nutzen hat einen besonderen Reiz: man muss keine Fehlerbehandlung einbauen die zur Laufzeit nicht auffindbare Dateien behandeln, niemand (oder zumindest die meisten) können diese Inhalte werde auslesen noch verändern.

Damit die Ressource eingebettet werden kann, muss diese in Visual Studio erst einmal zum Projekt hinzugefügt werden. An einem Beispiel gehe ich das mal durch:Embedded PNG-File Wie im Bild rechts zu sehen ist, habe ich ein Bild Delete.png zum Projekt hinzugefügt. Um dieses aus XAML anzusprechen bedarf es einer speziellen Einstellung: Im Eigenschaftenfenster muss unter “Build Action” Resource ausgewählt sein. Die allgemeine Syntax würde lauten:

   Icon="/{AssemblyName};component/directory/Image.ico"

Wobei {AssemblyName} durch den Namen des Assembly ersetzt werden muss (meist der Name des WPF-Projektes). Der anschließenden Teil (“;component/”) muss ebenfalls vorhanden sein und ist immer gleich. Den AssemblyName kann auch zur Laufzeit mit folgendem Befehl abgefragt werden:

   this.getType().Assembly.GetName().Name;

Und das ganze am Beispiel des Icons eines Window:

<Window 
   x:Class="MicroMite.Gui.MainWindow"
   Title="MicroMite" Height="400" Width="280"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   Icon="/MicroMite;component/content/icon/miscellaneous/MiteWindowIcon.ico"/>

Um aus C# mittels Programmcode auf die Ressource zugreifen zu können, muss diese in den Eigenschaften als “Embedded Ressource” unter “Build Action” aufgeführt werden. Mir ist es bisher nicht gelungen eine “Resource” aus C# anzusprechen oder eine “Embedded Ressource” unter XAML – sehr schade eigentlich. Ansonsten geht das wie folgt:

   String uri = @"content.icon.miscellaneous.Delete.png";
   Assembly assembly = this.getType().Assembly;
   String assemblyName = ssembly.GetName().Name;
   System.IO.Stream stream = assembly.GetManifestResourceStream(assemblyName+"." + uri);
   Icon.Resource = new PngBitmapDecoder(stream,
                                         BitmapCreateOptions.PreservePixelFormat,
                                         BitmapCacheOption.Default).Frames[0];

Da die Inhalte roh in die Exe eingebettet werden, behalten diese ihr Format bei und müssen erst mit einem passenden Decoder zu einer ImageSource konvertiert werden. Im Namespace  System.Windows.Media.Imaging stehe passenden Decoder für die Bildformate PNG, JPEG, BMP, GIF, TIFF und WMB  bereit. Ich werde demnächst eine DLL hier einstellen, welche all diese Funktionalitäten abstrahiert.

1 Comment :, , , more...

HowTo – Trayicon mit Contextmenu

by on Apr.18, 2010, under HowTo, MicroMite

Im folgenden geht es um die Erstellung eines Trayicons (oder auch Notifyicon) mit einem ContextmenuTray from Windows. Trayicons sind die kleinen Symbole die links neben der Uhr im Windows angezeigt werden und meist von Instantmessangern und Antivirenprogrammen besetzt werden. Bei mir sieht das in etwa so wie auf nebenstehendem Bild aus.

WPF selbst bietet keine Trayicon-Komponente. Aber im Namespace System.Windows.Forms gibt es eine Klasse NotifyIcon die diesen Zweck erfüllt. Bei einem WPF-Projekt muss jetzt als erstes die passenden Referenz hinzugefügt werden:

  • Klick auf Referenzen -> Referenz hinzufügen
  • Suche nach System.Windows.Forms
  • Ok

Im Anschluss eine Membervariable vom Typ NotifiyIcon erstellen welche im Konstruktor initialisiert wird:

private System.Windows.Forms.NotifyIcon trayicon;
public Window1(){
   trayicon = new System.Windows.Forms.NotifyIcon();
   trayicon.BalloonTipTitle = "BalloonTitle";
   trayicon.BalloonTipText = "BalloonText";
   trayicon.Icon = new System.Drawing.Icon(@"C:\icon.ico");
   trayicon.Text = "Text on hover icon"
   trayicon.MouseClick += new System.Windows.Forms.MouseEventHandler(trayiconClickHandler);
   trayicon.Visible = true;
}

Die meisten Eigenschaften dürften selbsterklärend sein. Falls nicht ist hier die entsprechende Referenz von Microsoft. Der BallonTip ist eine kleine Sprechblase mit Informationen anzeigt. Diese wird mittels ShowBalloonTip(3000) für 3 Sekunden lang angezeigt wird. Ganz wichtig ist die Eigenschaft Visible auf true zu setzen, da diese normalerweise deaktiviert ist. Das NotifyIcon besitzt auch eine Click-Event welches anstelle des MouseClick-Events verwendet werden könnte. Diese bietet allerdings nicht die Möglichkeit zu unterscheiden welche Maustaste gedrückt wurde.

Die Eigenschaft NotifiyIcon.ContextMenu ist vom Typ ein Array aus MenuItems. Bereits bestehende könnten hier folglich wiederverwendet werden:


   System.Windows.Forms.MenuItem[] menuitems= new System.Windows.Forms.MenuItem[2];
   menuitems[0] = new System.Windows.Forms.MenuItem("Go to Google", gotoClickHandler);
   menuitems[1] = new System.Windows.Forms.MenuItem("Exit", exitClickHandler);

Ein MenuItem erwartet eine Beschriftung sowie ein EventHandler welcher beim Klicken aufgerufen wird. Kleine Anmerkung: MenuItem hat eine Eigenschaft MenuItems, es ist also folglich möglich verschachtelte Menüs zu erzeugen. Im folgenden nun die Eventhandler, der das Hauptfenster bei Linksklick öffnet bzw. versteckt:

void trayiconClickHandler(object sender, System.Windows.Forms.MouseEventArgs e)
{
   if (e.Button == System.Windows.Forms.MouseButtons.Left)//right is for context menu
   {
      if (IsVisible) Hide();
      else this.Show();
   }
}

Der erste Eventhandler im Kontextmenu zeigt wie eine beliebige URL im Standardbrwoser aufgerufen werden kann. Der zweite beendet lediglich das Programm:

private void goToMiteClickHandler(object sender, System.EventArgs e)
{
   System.Diagnostics.Process.Start("www.google.de");
}
private void exitClickHandler(object sender, System.EventArgs e)
{
   Close();
}

Alles im Allem also gar nicht so schwer, man muss nur wissen wie.

Comments Off on HowTo – Trayicon mit Contextmenu :, , , , , more...

HowTo: Anaglyph Shader in XNA

by on Feb.27, 2010, under 3D, Computer Graphics, HowTo, shader

Im Rahmen meiner Bachelorarbeit brauchte ich eine Möglichkeit, in XNA Bilder anaglyph zu kodieren. Ausgangsmaterial waren 2 Bilder, eines für das linke, eines für das rechte Auge. Diese müssen Mithilfe einer SpriteBatch gemalt und durch Verwendung eines Pixelshaders entsprechend kodiert werden. Der verwendete Shader kodiert die Bilder so, das diese mit einer rot-cyan-Brille korrekt betrachtet werden können. Die Kodierung selbst erfolgt durch den Dubois-Algorithmus von Frederic V. Hessmann, welchen ich aus seinem Java-Programm zu Erstellung von Anaglyphbildern adaptiert habe.
Auf der Seite von XNA sieht das Ganze dann wie folgt aus:

Texture2D left = Texture2D.FromFile(graphicsDevice, FilepathLeft);
Texture2D right = Texture2D.FromFile(graphicsDevice, FilepathRight);

spriteBatch.Begin(
   SpriteBlendMode.None,
   SpriteSortMode.Immediate,
   SaveStateMode.SaveState);
{
   effect.Begin();
   {
      effect.CurrentTechnique.Passes[0].Begin();
      effect.Parameters["left"].SetValue(left);
      effect.CommitChanges();
      spriteBatch.Draw(right, new Microsoft.Xna.Framework.Rectangle(
         0, 0, Width, Height), Color.White);
      effect.CurrentTechnique.Passes[0].End();
   }
   effect.End();
}
spriteBatch.End();

Das linke Teilbild wird als Parameter an den Shader übergeben, das rechte Teilbild wird direkt mit der SpriteBatch gemalt.

//Auszug aus dem Shader

float4 PixelShader(float2 uv: TEXCOORD0) : COLOR
{
   float4 l = tex2D(leftSampler, uv);
   float4 r = tex2D(ColorMapSampler, uv);

   float red = 0.456100*l.r + 0.500484*l.g + 0.176381*l.b
             - 0.0434706*r.r - 0.0879388*r.g - 0.00155529*r.b;
   if (red > 1) { red = 1; }   if (red < 0) { red = 0; }

   float green = -0.0400822*l.r - 0.0378246*l.g
                 -0.0157589*l.b + 0.378476*r.r
                 +0.73364*r.g - 0.0184503*r.b;

   if (green > 1) { green = 1; }   if (green < 0) { green = 0; }

   float blue = -0.0152161*l.r - 0.0205971*l.g
                -0.00546856*l.b - 0.0721527*r.r
                -0.112961*r.g + 1.2264*r.b;

   if (blue > 1) { blue = 1; }   if (blue < 0) { blue = 0; }

   return float4(red, green, blue, 1);
}

Als erstes wird der aktuelle Pixel aus de Bildern gesampelt, wobei der linke Sampler ein gewöhnlicher Texturesampler ist und der rechte Sample auf Register s0 (sampler ColorMapSampler : register(s0)) zugreift. Im Anschluss werden die 3 Farbkanäle des Zielpixels nach dem Dubois-Algorithmus berechnet und als zu zeichnender Pixel zurück geliefert.

Der im Folgenden verlinkte AnaglypShader.fx und JPSLoader.cs bauen im Wesentlichen auf diesem Beispiel auf und erweitern dieses noch. Der JPS-Loader ist in der Lage ein JPS-Bild (JPEG-Stereo) zu laden, welches im Grunde eine JPEG-Bild ist, bei dem das linke und rechte Bild nebeneinander in der gleichen Datei liegen. Der JPS-Loader zerschneidet das Bild und liefert so das Ausgangsmaterial für den oben beschriebenen
AnaglypShader.

Comments Off on HowTo: Anaglyph Shader in XNA :, , , , more...

Anmeldebildschirm von Windows7 ändern

by on Dec.21, 2009, under ByTheWay, HowTo

In der c’t 26/2009 auf der Seite 172 laß ich, wie man den Logon-Screen von Windows 7 ändern kann. Dazu müssen nur ein paar Kleinigkeiten gemacht, beachtet werden:

  1. Dieses Feature (scheinbar für OEM gedacht)  muss in der Registry aktiviert werden. Dazu muss unter HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background ein 32bit DWORD mit dem Wert 1 gesetzt werden.
  2. Im Systemverzeichnis muss ein Ordner unter C:\Windows\System32\oobe\ names info erstellt werden. In diesem wiederum muss ein Ordner namens backgrounds erstellt werden.
  3. In diesen Odner muss nun eine jpg-Datei namens backgroundDefault.jpg kopiert werden, welche als Hintergrund angezeigt werden soll. Diese darf  leider nicht größer als 250kb sein. Habe noch nicht getestet was passiert, wenn diese größer ist.

Im Prinzip gar nicht so schwer, wenn man weiß wie es geht. Mal sehen, vielleicht finde ich ja mal Zeit dafür ein kleines Tool zu schreiben.

Prinzipiell scheint das gleiche unter Vista auch zu gehen, zumindest gibt es hier ein Tool dazu. Aber wenn man diesem Post trauen kann, ist das wohl nciht gnaz so trivial zu machen wie in Windows 7.

Comments Off on Anmeldebildschirm von Windows7 ändern :, , more...

HowTo – DLL erstellen und benutzen unter Visual Studio 2008

by on Jun.19, 2009, under HowTo

Für unsere Bachelorarbeit erstellen wir ein Programm zur Verzerrungsfreien Darstellung von Panoramen auf gekrümmten Flächen. Uns erschien es sinnvoll, den Verzerrungsalgorithmus in eine DLL auszugliedern, damit er dann ggf. auch von Anderen verwendet werden kann. Allerdings hatten wir keinen blassen Schimmer, wie man eine eigene DLL erstellt und anzapft. Auf der Suche nach Informationen fanden wir bei codeguru.com eine Anleitung. Obgleich diese sehr hilfreich war, brauchten wir recht lange um das Beispiel in VS2008 umzusetzen. Des weiteren enthält die Anleitung auf codeguru.com einen kleinen Fehler der hier bereits korrigiert ist.

Deshalb kommt hier jetzt eine Schritt-für-Schritt Anleitung:

Create a DLL

  • VS => File => New Projekt => Visual C++ => Win32 => Win32 Console Application
    • Name: DLLPROJECT
    • Application type: dll
    • Additionnal Option: empty project
  • Add => Header File to “Header files” named DLLPROJECT.h
    • add following code:
    • #ifndef _DLL_TEST
      #define _DLL_TEST
      #include <iostream>

      #if defined DLL_EXPORT
      #define DECLDIR __declspec(dllexport)
      #else
      #define DECLDIR __declspec(dllimport)
      #endif

      extern “C” {
      DECLDIR void teststd(void);
      }
      #endif

  • Add => C++ file to “Source files” named DLLPROJECT.cpp
    • add following code:
    • #include <iostream>
      #define DLL_EXPORT

      #include “DLLPROJECT.h”

      extern “C”
      {
      DECLDIR void teststd(void)
      {
      std::cout << “Hallo World – FROM DLLPROJECT” << std::endl;
      }
      }

Usage of the DLLPROJECT.dll in a C++ Projekt

  • VS => File => New Projekt => Visual C++ => Win32 => Win32 Console Application
    • same solution
    • Name: APPLICATIONPROJECTCPP
    • Application type: console application
    • Additionnal Option: empty project
  • Add => C++ file to “Source Files” named APPLICATIONPROJECTCPP.cpp
    • add following code:
    • #include <iostream>
      #include <DLLPROJECT.h>
      #pragma comment (lib, "DLLPROJECT.lib")
      int main(){
      teststd();
      float f;
      std::cin >> f;
      }

  • Build => Project only => Build only DLL-Project
  • APPLICATIONPROJECTCPP => Properties => C/C++ => General => Additional Include Directories
    • add path to Headerfile of DLLPROJECT ($(SolutionDir)\DLL-Project\)
  • APPLICATIONPROJECTCPP => Properties => C/C++ => Linker => Additional Library Directories
    • add path to *.lib-File of DLLPROJECT ($(TargetDir)\)
  • APPLICATIONPROJECTCPP => Set as StartUp Project

Usage of the DLLPROJECT.dll in a C# Projekt

  • VS => File => New Projekt => Visual C# => Windows => Console Application
    • same solution
    • Name: APPLICATIONPROJECTCS
    • Application type: console application
    • replace code with following:
    • using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Runtime.InteropServices;

      namespace CSharpTest
      {
      class Program
      {
      [DllImport(“DLLPROJECT.dll”)]
      private static extern void teststd();

      static void Main(string[] args)
      {
      teststd();
      Console.Read();
      }
      }
      }

  • Build => Configuration Manager => Plattform => New …
    • x86
  • APPLICATIONPROJECTCS => Set as StartUp Project
  • copy of DLLPROJECT.dll nach APPLICATIONPROJECTCS/bin/x86/debug
  • Debug
Comments Off on HowTo – DLL erstellen und benutzen unter Visual Studio 2008 :, , , more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...