Archive for Oktober, 2007

APPLE: Mac-Day in Pankow

Irgendwie ist heute Mac-Day in Pankow: Heute nachmittag ist OS X Leopard (10.5) hier aufgeschlagen und wird gerade auf dem iBook installiert – und ich sitze gerade am niegelnagelneuen MacBook und freue mich über die geile Haptik. Die Tastatur tippt sich grenzgenial, das Display ist klasse (obwohl es spiegelt), der Rechner ist leise. Nix zu meckern also.

Naja, doch: Ich habe aus Versehen die falsche Festplatte gekauft – PATA statt SATA. Macht aber letztlich nix. Dann nutze ich sie halt als externes Speichermedium. Benötige ich sowieso für die Sicherung vom kleinen iBook.

APPLE: Ich habs getan!

So, nun hab ich es auch gemacht: Unser iBook bekommt ein Geschwisterlein. Ein kleines, süßes MacBook. Gerade eben bei eBay gekauft, morgen oder in der nächsten Woche hole ich es ab. Auch wenn der Thomas damit keine optimalen Erfahrungen gesammelt hat – ich kenne ja bereits das kleine iBook und werde sicher mit dem MacBook klar kommen.

Ich freu mich. :-)

ASP.NET: Wenn ASP.NET-Formsauthentication nicht funktioniert…

…könnte das unter Umständen auch daran liegen, dass sie nicht aktiviert ist. Dementsprechend kann der Eintrag

in der web.config durchaus Wunder bewirken, wie der Kollege in diesem Thread sicherlich bestätigen kann.

Was ich ihm nicht verraten habe: Mir ist es vor einigen Tagen genau so gegangen, deshalb bin ich auch so schnell auf des Rätsels Lösung gekommen.

APPLE: OS X 10.5

Irgendwann habe ich es dann auch geblickt: Nachdem mich mein Schatz den dritten Tag in Folge fragt, wie ich denn das neue Mac OS X 10.5 (Leopard) finde, ist bei mir der Groschen gefallen. Naja, eigentlich mehr bei Apple. Weil ich es dann mal bestellt habe, das gute Stück. Für 129,– EUR – als Ultimate-Version gewissermaßen.

Vielleicht kommt es Samstag zusammen mit dem neuen Hans Harry Potter. Den habe ich auch bestellt, nachdem ich die subtilen Hinweise verstanden hatte.

Dauert halt immer ein wenig. Bin eben ein Callboy Kerl.

OFF-TOPIC: Und ihr wundert euch noch über Politikverdrossenheit?

Ich habe gerade den Fehler gemacht, mal bei Maybritt Illner reinzuschauen. Thema war “Sozial ist, was Wähler schafft” – und Gäste waren unter anderem Andrea Ypsilanti (SPD), Norbert Röttgen (CDU), Klaus Ernst (Linkspartei) und Brigitte Seebacher (Ex-Ehefrau von Willy Brandt). Mal komplett abgesehen davon, dass hier mal wieder jeder an dem anderen vorbeispricht, waren einige Sachen enorm auffällig und nervend:

  • Die Witwe von Willy Brandt war nicht ein einziges Mal in der Lage, jemand anderem zuzuhören, sondern fiel ständig allen Sprechern ins Wort
  • Der Typ von der Linkspartei wurde ständig provoziert und von der Moderatorin abgewürgt. Der konnte nicht einmal einen Gedanken wirklich zu Ende bringen
  • Es kam ein Wirtschaftswissenschaftler zu Wort, der ernsthaft der Meinung war, dass eine Anhebung von Hartz IV auf irgendwas um 400 EUR die Leute dazu verleiten würde, noch weniger auf Arbeitssuche zu gehen, was an sich schonmal eine Frechheit ist, wenn man sich mal anschaut, wie weit man mit 400 EUR kommt
  • Der gleiche Wirtschaftswissenschaftler fand auch, dass 900 EUR für einen Vollzeitjob angemessen sind – rechne ich das mal auf 160 Stunden im Monat um, ergibt sich ein Stundenlohn von 5,62 EUR. Brutto, versteht sich.

Mal im Ernst: Man mag ja von den Linken und ihren Forderungen halten, was man will. Und man mag sie auch bekämpfen wollen und ihre Aussagen für nicht realisierbar halten. Völlig in Ordnung und völlig legitim.

Aber wenn man dabei vergisst, dass hinter diesen Forderungen (ebenso wie hinter den Mindestlohn-Forderungen aller möglichen Parteien) durchaus Realitäten stehen, dann ist das schon nicht mehr traurig, sondern ignorant. Und dann muss man sich auch nicht wundern, wenn die Leute die Schnauze voll haben, von Politikern, die sich mehr um parteitaktische Erwägungen scheren, als sich um die Bedürfnisse der Schwächeren zu kümmern. Und dann passiert genau das: Die Ränder werden immer stärker, weil sie als Korrektiv zu der großen trägen Mitte dienen.

Mein ganz persönlicher Eindruck ist: Die Leute sind keineswegs politikmüde. Die sind parteimüde und können die ganzen Kochs, Becks, Lafontaines, Merkels, Westerwelles, Bütikofers und deren Kollegen nicht mehr sehen. Die Meinung der großen Mehrheit auf der Straße ist doch, dass “die da oben” nur noch im eigenen Saft kochen und den Kontakt zum “einfachen Volk” schlicht verloren haben.

Und wenn ich dann solche Sendungen wie eben die Sendung vorhin sehe, kann ich das den Leuten nicht mehr verübeln – die Protagonisten haben in ihrer Ignoranz und ihrer Überheblichkeit alles getan, um diesen Eindruck zu verstärken.

Zum Heulen ist sowas.

OFF-TOPIC: Nein, nein, nein!

Ich habe heute maximale Tapferkeit bewiesen: Ich habe bei Vodafone den neue=
n Palm Treo 500v ausprobiert und nicht gekauft. Obwohl ich=
ihn h=E4tte gleich mitnehmen k=F6nnen. Und obwohl das Ger=E4t enorm geil a=
usieht und einen sehr angenehmen Eindruck macht. Nein, ich war tapfer und v=
ern=FCnftig.

Ich hasse mich selbst daf=FCr.

WELTHERRSCHAFT: Es ist gut, zu sehen…

….wenn Software, die man geschrieben hat, auf einer Branchenmesse angebot=
en, gezeigt und von den potentiellen Kunden auch angenommen wird.

Da lohnen sich dann r=FCckwirkend der Stress und die durchgemachten N=E4cht=
e.

So, und jetzt gehe ich zu dem Kunden und lasse mir die neuen Bugs um die Oh=
ren hauen.

MICROSOFT: Bill kauft Facebook

Na, das ist doch mal eine Neuheit: Der Kollege Gates hat Facebook href=3D"http://www.golem.de/0710/55614.html">gekauft. Wenn es mich =
jetzt (a) noch interessieren w=FCrde und ich (b) mit diesem ganzen =
Communityquatsch etwas anfangen k=F6nnte, dann w=E4re das ein Thema, mit =
dem ich mich auch intensiver auseinandersetzen w=FCrde.

Aber so?

VISTA: VPN oder nicht

Gott, ich werde hier noch wahnsinnig: Vistas VPN-Implementierung ist extrem=
eigenwillig: Selbe Einstellungen wie bei XP – null Erfolg, w=E4hrend der V=
org=E4nger entspannt verbindet. Nach einigem Recherchieren fand ich heraus,=
dass es nicht nur mir so geht, sondern einem durchaus beachtenswerten Proz=
entsatz von Benutzern.

Und, das Ergebnis? Nein, ich versuche keine Workarounds mehr. Ich warte auf=
die finale Vista-Version und solange lasse ich in einer VM ein gutes, alte=
s XP laufen. Es installiert bereits.=

OFF-TOPIC: Feel good fast food

Das ist doch endlich mal was f=FCr so Typen, wie ich einer bin: =D6ko-Fastf=
ood, und das Ganze auch noch schonend zubereitet. Ein entsprechender Laden =
(RNBS) hat gerade hundert Meter von meinem B=FCro entfernt er=F6ffnet. Edel=
, reduziert und sauber ist das Ding schon mal optisch kein Vergleich mit de=
n g=E4ngigen Fastfood-Ketten.

Nun muss der Kram nur noch schmecken – aber das wei=DF ich erst in einer gu=
ten Stunde, wenn ich zu Hause bin und halt gegessen habe. Lecker riecht es =
aber schon mal.

Bei dieser Gelegenheit liebe Gr=FC=DFe an meinen Lieblings-=D6si-Bayern – S=
tichwort “Belanglos”. :-)

UPDATE: Essen war lecker, ich lebe noch. Der Laden ist gut!

OFF-TOPIC: Werbung im Fernsehen

Boah, was bin ich momentan pissig auf die Werbung im Fernsehen zu sprechen (gut, bin ich eigentlich immer). Besonderes Lowlight: Die Werbung für die Sparkassen-Altersvorsorge. Die mit dem Baby – wo die Ex-Freundin vor der Tür steht und dem Ex-Freund das Baby in die Hand drückt (schonmal eine Frechheit). Dann kommt die aktuelle Freundin, sieht das Baby und bekommt einen Anfall (kinderfeindlich). Dann kommt der Vermieter und kündigt die Wohnung – wegen “Verheimlichung einer Familie” (familienfeindlich). Und zuletzt furzt das Kind den Ex-Freund an (wieder kinderfeindlich).

Für mich als Vater zweier Kinder ist damit die Sparkasse in Sachen Altersvorsorge gestorben. Hat sich erledigt – ist nicht witzig und greift mich auf der ganzen Linie an.

Und ab dafür.

DOTNET: Entwickler gesucht!

Mein ehemaliger Chef (ist schon ein paar Jahre her) sucht derzeit händeringend .NET-Entwickler, die frisch von der Uni kommen (hängt mit den Förderbedingungen zusammen). Wer also schon ein wenig in der Thematik drin ist und was im .NET-Umfeld bewegen möchte, möge mir einfach mal ganz unverbindlich eine Mail mit seinem Profil schicken. Ich leite das dann weiter – und nein, genauere Infos habe ich leider nicht.

Übrigens freue ich mich auch immer über Profile von Selbstständigen, da ich einen Haufen Anfragen erhalte. Also einfach her damit – ich sichte es dann und leite es bei Bedarf weiter.

DOTNET: eBay SDK und CountryDetailList

Wer derzeit mit dem eBay SDK für .NET arbeitet, wird eine böse Erfahrung erleben, wenn er die von eBay bereitgestellte Liste der möglichen Artikelstandorte herunterladen möchte. Folgender Code führt beim derzeitigen Stand des SDKs (Version 523) zu einer Exception:

// Create the call
GeteBayDetailsCall details =
   new GeteBayDetailsCall();
details.Site = SiteCodeType.Germany
details.EnableCompression = true;

// List of countries
CountryDetailsTypeCollection countries = null;

// Execute the call
try
{
   // Get the countries
   details.GeteBayDetails(
      new DetailNameCodeTypeCollection(
         new DetailNameCodeType[] {
            DetailNameCodeType.CountryDetails }));

   // Assign the countries
   countries = details.CountryDetailList;
}
catch (Exception ex)
{
   // Handle the exception
}

Unweigerlich springt das Ding in den catch-Block und meldet, dass der CountryCode-Typ “ME” (steht für “Montenegro”) nicht einem Element der CountryCodeType-Auflistung zugeordnet werden kann (“Instanzvalisierungsfehler: ‘ME’ ist kein gültiger Wert für CountryCodeType”). Selbiges gilt übrigens für das Element “RS” (für Serbien).

Schaut man sich die CountryCodeType-Auflistung an, wird man auch feststellen, dass es dort kein “ME”-Element gibt. Damit wäre ganz elegant jede .NET-Applikation von der eBay-Nutzung ausgeschlossen, die sich an die eBay-BestPractices hält.

Wenn es nicht einen Workaround gäbe: Man nehme das zurückgegebene SOAP und parse das manuell durch. So man es benötigt, wandele man die Elemente dann händisch in die korrekten Elemente um und generiere die Liste der Länder händisch. Dabei muss man lediglich die Ausnahme abfangen, die auftritt, wenn man versucht, den Wert “ME” in ein Element der CountryCodeType-Auflistung zu konvertieren. Folgender Code muss in den catch-Block, damit es funktioniert:

// Get the SOAP
string soap = details.SoapResponse;

// Parse the SOAP directly
XmlDocument soapDoc = new XmlDocument();
soapDoc.LoadXml(soap);

XmlNamespaceManager mgr =
new XmlNamespaceManager(soapDoc.NameTable);
mgr.AddNamespace(“soap”, “http://schemas.xmlsoap.org/soap/envelope/”);
mgr.AddNamespace(“xsd”, “http://www.w3.org/2001/XMLSchema”);
mgr.AddNamespace(“xsi”, “http://www.w3.org/2001/XMLSchema-instance”);
mgr.AddNamespace(“ebay”, “urn:ebay:apis:eBLBaseComponents”);

XmlNodeList countries = soapDoc.SelectNodes(
   “//ebay:CountryDetails”, mgr);

CountryDetailsTypeCollection cdc =
   new CountryDetailsTypeCollection();

foreach (XmlNode countryInfo in countries)
{
   // Name und Beschreibung auslesen
   string countryName = countryInfo.SelectSingleNode(
      “./ebay:Country”, mgr).InnerText;
   string countryDescr = countryInfo.SelectSingleNode(
      “./ebay:Description”, mgr).InnerText;

   try
   {
      // Erzeugen des CountryDetailsTypes
      CountryDetailsType cdt = new CountryDetailsType();
      cdt.Country = (CountryCodeType)
         Enum.Parse(typeof(CountryCodeType), countryName);
      cdt.Description = countryDescr;

      // Merken
      cdc.Add(cdt);
   }
   catch { }

}
countries = cdc;

Wenn man das umgesetzt hat, funktioniert auch der Abruf der Länder wieder korrekt.

Aber peinlich isses schon für die Herrschaften, gelle?

BRAINDUMP: NT-AUTORITÄT\IUSR für Datenbankzugriff

Gerade habe ich eine Web-Applikation für den Datenbankzugriff per Integrated Security unter Vista und IIS 7 konfigurieren wollen, da steckte ich mal wieder fest: Mein gewohntes Hinzufügen von NT-AUTORITÄT\NETZWERKDIENST half in diesem Fall nix. Stattdessen ging es mit NT-AUTORITÄT\IUSR. Hängt damit zusammen, dass Integrierte Sicherheit im IIS für diese Applikation aktiviert ist.

DOTNET: .NET CompactFramework für S60

Das ist doch mal eine nette Nachricht für alle .NET-CF-Entwickler: Die Firma Red Five Labs stellt in der nächsten Woche eine vollständige .NET-CF-Implementierung für S60 3rd Edition vor, meldet AreaMobile.

Gut, warten wir erstmal ab, ob es tatsächlich funktioniert und wie es sich verbreitet. Aber grundsätzlich erschließt sich so die S60-Plattform für .NET-Entwickler, speziell im Firmen-Umfeld. Wenn es denn funktioniert…

SOFTWARE: Raus aus der VM

Gestern abend hat es mir gereicht: Ich habe meine Entwicklungstätigkeit aus meiner VMWare auf den Host verlegt. War ja nicht mehr auszuhalten, was da in Sachen Performance abging (bzw. nicht abging), speziell wenn ich versucht habe, eine Windows-Forms-Applikation zu zaubern: Teils mehrere Minuten Aktualisierungsläufe vom Visual Studio, speziell beim Einsatz von transparenten Hintergründen eine Bildaufbaugeschwindigkeit, bei der man jeden Pixel zählen konnte, sowie regelmäßige Abstürze des Windows Form-Designers und daraus resultierender Verlust aller Steuerelemente eines Formulars (ja, die waren auch aus der .designer.vb-Datei raus).

Also habe ich mich hingesetzt und installierte…

  • …VS 2005 (0,75h)
  • …VS 2005 SP1 (1h)
  • …den VS 2005 SP1-Patch für Vista(0,25h)
  • …MSDN (0,25h)
  • …SQL Server Developer Edition (0,5h)
  • …IIS (0,25h)
  • …diverse Komponenten (0,5h)
  • …Refactor! Pro (0,25h)
  • …sämtlichen entwicklungsrelevanten Kram aus der VM (1,5h)
  • …Webapplikationen und Datenbanken (3h).

Danach noch VS 2005 konfiguriert und das Consolas Font-Package installiert (0,25h). Zusammen 8,5h – oder in Worten: Achteinhalb Stunden.

Boah, bin ich fertig. Ich bin dann heute nacht um 4.30 Uhr ins Bett und wurde um 6.30 Uhr wieder von meinen Kids geweckt. Aber wenigstens läuft jetzt erstmal alles – und wenn man sich daran gewöhnt hat, dass VS 2005 und SQL Server Management Studio stets mit Administrator-Rechten ausgeführt werden sollen, dann kann man auch durchaus produktiv arbeiten.

Mist, mir fällt auf, ich hab den SourceSafe vergessen. Nochmal ne halbe Stunde, bis alles installiert und konfiguriert ist. :-(

SOFTWARE: Alles neu macht der Sven!

Der SpeedCommander ist jetzt offiziell in Version 12 verfügbar, schreibt Golem. Die Beta-Tests sind also somit abgeschlossen und das gute Stück ist final. Download wie üblich beim SpeedProject und von dieser Stelle aus ganz lieben Gruß an Sven.

Gutes Tool, definitiv sein Geld wert.

DOTNET: Mehrdimensionales Char-Array aus C++-Komponente abrufen

Das hat mich jetzt geschlagene 36 Stunden gekostet (gefühlt drei Wochen): Ich musste ein mehrdimensionales Char-Array aus einer C++-Komponente abholen. Dieses Char-Array ist definiert als

   char (*parmWertArray)[100][20]

Also wird im Grunde ein String-Array mit fester Länge definiert. “Jut”, denkt sich da der geneigte Entwickler, “kann ja nicht so schwer sein”. Also wird flugs in die Trickkiste gegriffen und ein Array von StringBuildern verwendet (denn wir wissen bereits, dass Rückgaben in StringBuilder kommen sollen). Schnell mal sowas wie

   Dim parameters(99) As StringBuilder

geschrieben und in einer Schleife initialisiert. Hoffnungsvoll an die Komponente übergeben, und dann… Nix. Steht nix drin. Nirgendwo.

Okay, dann nehmen wir einen einzelnen StringBuilder, den wir als

   Dim parameters As New StringBuilder(2000)

definieren, denn 100 * 20 Zeichen macht 2000 Zeichen. Schnell übergeben, und siehe! Es gab ein Ergebnis: Einen einzelnen Wert. Um genau zu sein, den ersten Wert des String-Arrays. Das stimmt froh. Inhaltlich aber eher nicht.

Dann eben IntPtr, denn der Kollege Entwickler hat mal gelesen, dass man sowas mit IntPtr abrufen kann. Geht wahrscheinlich auch, nicht aber bei dieser Komponente, denn die erwartet ein vorinitialisiertes Array. Und kann mit einem per Referenz übergebenen IntPtr-Array nix anfangen.

Char-Array? Vielleicht als

   Dim parameters(99, 19) As Char

definiert? Nutzlos, geht nicht.

Nachdem mittlerweile 36 Stunden ins Land gegangen sind, besinnt sich der Entwickler auf seinen guten Freund, der ihm letztens bereits schonmal geholfen hat. Dem schickt er den Krempel und bekommt binnen 90 Minuten die Lösung: Byte-Array verwenden!

   Dim parameters(99, 19) As Byte

Die zurückgegebenen Bytes müssen nun noch in Chars umgewandelt und dann weiterverarbeitet werden. Das erledigt folgende Methode, die ebenfalls auf dem Lösungsansatz des lieben Kollegen basiert:

   Public Shared Function GetArrayValues( _
      ByVal aryData As Byte(,), _
      ByVal intItemsInArray As Int32) As String

      ‘ Hier kommt die Rückgabe rein
      Dim objResult As New StringBuilder(aryData.Length)

      ‘ Das Try-Catch kann auch weg, aber ich
      ‘ habe jetzt keine Lust dazu. Ist ja mein Blog. :-)
      Try
         Dim objChar As Char

         Dim intMaxLength As Int32 = intItemsInArray – 1
         If intMaxLength > aryData.GetUpperBound(0) Then
            intMaxLength = aryData.GetUpperBound(0)
         End If

         ‘ Beide Arrays durchlaufen
         For i As Int32 = 0 To intMaxLength
            For j As Int32 = 0 To aryData.GetUpperBound(1)

               ‘ Aktuellen Byte-Wert konvertieren
               ‘ und dem Ergebnis anfügen
               If aryData(i, j) > Byte.MinValue Then
                  objChar = ChrW(aryData(i, j))
                  objResult.Append(objChar)
               End If

               ‘ Irgendwas zum Trennen der verschiedenen Werte
               If (j = aryData.GetUpperBound(1)) Then
                  objResult.Append(“;”)
               End If
            Next
         Next

      Catch ex As Exception
      End Try

      ‘ Fertig
      Return objResult.ToString
   End Function

Der Aufruf ist dann extrem simpel:

   ‘ Abruf der Daten
   Dim aryData(99, 19) As Byte
   …

   ‘ Ermitteln der tatsächlichen Werte
   Dim strValue As String = GetArrayValues(aryData, 99)

   ‘ In String-Array konvertieren oder irgendwas anderes machen
   Dim aryValues() As String = strValue.Split(“;”)

Manchmal überlege ich mir ernsthaft, ob ich dem Kerl mal ein paar Blumen schicken soll. Und ob ich für P/Invoke zu doof bin. Aber letzteres nicht ernsthaft. ;-)

ASP.NET: Bilder in die Datenbank oder ins Dateisystem?

Gerade eben kocht in der ASP.NET-Newsgroup die Frage eines ASP.NET-Novizen hoch, ob Bilder besser in die Datenbank oder ins Dateisystem gehören. Er selbst speichert sie in der Datenbank, denn die Vorteile sind aus seiner Sicht bestechend:

  • Zusammenhang zwischen Bildern und Daten
  • Kein externes Rumliegen der Bilder (Datensicherung, Konsistenz)
  • Datenbank kann die Bilder als BLOBs verwalten
  • Die Applikation kann über ihre Logik Zugriffsbeschränkungen und Bildmanipulationen zur Laufzeit implementieren

Generell stimmen diese Vorteile auch, aber man erkauft sie sich mit einigen Nachteilen, die man zumindest kennen sollte:

  • Jedes Bild muss extra aus der Datenbank abgerufen werden (ADO.NET oder NHibernate oder was auch immer)
  • Der Abruf der Bilder läuft stets über die .NET-Applikation
  • Der Webserver kann physisch im Dateisystem liegende Bilder performanter abrufen, als dies die .NET-Applikation schaffen könnte
  • Ggf. kann auf Ebene des Webservers ein Caching der Bilder stattfinden
  • Die Bilder können u.U. per FTP verwaltet oder geändert werden

Aus Performance-Erwägungen sollten Bilder deshalb nicht in der Datenbank gespeichert werden, denn die Speicherung der Bilder in der Datenbank kann für genau die fünf Prozent Last sorgen, die die Applikation subjektiv nicht mehr reagieren ließe, somit also das Fass zum Überlaufen bringen könnte.

Bei privaten, semiprofessionellen oder allgemeiner nicht mit Höchstlast und höchsten Skalierungsanforderungen gestraften Applikationen ist es aber völlig okay, die Bilder in der Datenbank zu halten. Da spricht – wenn man Vor- und Nachteile gegeneinander abwägt – nix dagegen.

Wer übrigens wissen möchte, wie man Bilder in der Datenbank speichert, ausliest und anzeigt, findet bei MSDN Solve einen passenden Artikel.

DOTNET: C-DLL in .NET einbinden

Wer sich mal so richtig eins mitgeben möchte, sollte mal versuchen, eine C-DLL in einer .NET-Applikation einzubinden. Nein, keine Windows-API-Irgendwas-Sache oder eine Pillepalle-COM-Komponente, sondern so ganz in echt die harte Tour: Eine C-DLL mit ohne vernünftiger Beschreibung, die ein paar Methoden exportiert.

Grundsätzlich ist der Import nicht schwierig: DllImport-Attribut über einer Methode setzen, die ihrerseits als static extern (in C#) bzw. einfach nur Shared (VB) gekennzeichnet ist. Selbstverständlich müssen Signatur und Methodenname stimmen, damit es funktionieren kann. Ach ja, die DLL muss natürlich auch irgendwo im Ausführungspfad sein. Dann geht es aber total einfach.

Bis es mit den EntryPointNotFoundExceptions anfängt. Jut, denkt sich da der geneigte Entwickler, hab ich ich halt Mist gebaut. Schaun wir in die rudimentäre API-Beschreibung und sehen es uns nochmal an: int initCore() steht dort. Fein, schlagen wir einfach mal nach und überprüfen die Datentypen: int aus C wird zu Int32 (also int in C# bzw. Integer in VB). Sonst noch was zu beachten? Nö, passt schon!

Passt nicht. Gibt die nächste EntryPointNotFoundException. Öko, vielleicht ist der Name falsch geschrieben. Vielleicht muss es ja InitCore() heißen. EntryPointNotFoundException. Initcore()? EntryPointNotFoundException. Vielleicht doch void statt int als Rückgabetyp – also void in C# und in VB flugs aus einer Function in eine Sub umgewandelt, das Teil. EntryPointNotFoundException.

Nun wird es Zeit für die ersten Selbstzweifel. Ein wenig rumgesurfe und die Hilfe eines guten Freundes bringen ein .NET-Kommandozeilentool (dumpbin) und einen praktischen DLL-Viewer (Dependency Walker) zum Vorschein. Beide ausprobiert. Beide zeigen an, dass die Methode existiert. Allerdings weicht die Schreibweise des Methodennamens minimal ab – statt initCore steht dort ?initCore@@YAHXZ. Das wird aber an Tools liegen – ist halt C-Mist, der ist nicht so angenehm wie .NET.

Mehrere Stunden später: EntryPointNotFoundException. Kopfschmerzen. Termindruck. Bis die Mail mit der Errettung eintrifft: Der Methodenname muss tatsächlich ?initCore@@YAHXZ heißen. Nur, wie soll man den in .NET angeben, ist doch schließlich kein gültiger Methodenname? Die Lösung heißt EntryPoint-Eigenschaft und die erlaubt es, den tatsächlichen Namen der Funktion in der externen Ressource anzugeben:
_
Public Shared Function InitCore() As Int32
End Function

[DllImport("foo.dll", EntryPoint="?initCore@@YAHXZ")]
public static extern int InitCore();

Und dann funktioniert es. Und ich beginne C-DLLs zu verabscheuen. Oder die .NET-Beispiele zu diesem Thema. Bin mir noch nicht ganz sicher, was schlimmer ist.

Nächste Seite »