Delphi-DLL in C#

14/05/2008 - 18:23 von Merwed | Report spam
Hi!

Ich wurde kürzlich mit der Aufgabe betraut, eine herkömmliche alte
Windows-DLL (kein COM, kein .NET, kein Quelltext) in ein C#-Programm
einzubinden.

Dabei bin ich bei meinen Versuchen auf zwei Probleme gestossen:

1. Die DLL verwendet geschachtelte Arrays double[][][], was von
P/Invoke nicht unterstützt wird.

Ich habe dann versucht, die dreidimensionale Array-Struktur
linear nachzubilden und ein entsprechendes eindimensionales
Array zu übergeben.

2. Dieser Versuch ist daran gescheitert, dass die Datenmenge
des Aufrufs zu groß für den Stack war.

Zur Änderung der Stack-Größe eines .NET-Programms steht aber
nur der Befehl editbin zur Verfügung, der nach der
Kompilierung des Programms hàtte aufgerufen werden müssen,
wodurch an ein Debugging des Programms nicht mehr zu denken
gewesen wàre. Der Aufruf der alten DLL aus einem Thread
heraus (für diesen kann die Stackgröße festgelegt werden),
zeigte dann größere Schwierigkeiten bei der Linearisierung
der mehrdimensionalen Arrays.

Als nàchstes bin ich zur Verwendung von Delphi.NET (TurboDelphi.NET in der
kostenlosen Version von 2006) übergegangen. Mit dieser Entwicklungsumgebung
war es schließlich möglich, die alte DLL einzubinden und in eine
.NET-Komponente zu verpacken. Diese .NET-Komponente kann problemlos mit
Visual Studio .NET 2003 verwendet werden. Dazu müssen sowohl die
Delphi-Assembly als auch die alte DLL für das VS2003-Programm verfügbar
sein.

Das ursprüngliche Problem ist aber noch nicht gelöst, denn die
Funktionalitàt der DLL soll in einem .NET 2.0-Programm verwendet werden und
genau das geht nicht, da bei dieser Konstellation ein BadImageFormat-Fehler
auftritt, sobald eine Funktion des Delphi-Wrappers aufgerufen wird, die zur
Ansprache der alten DLL führt.

Ich frage mich deshalb, ob es sich hier nur um ein Einstellungsproblem
handelt oder ob es z. B. möglich ist, die alte DLL mit in den Delphi-Wrapper
zu kompilieren oder ob es eine andere Möglichkeit gibt, .NET 2.0 zu
verwenden, ohne dass BadImageFormatException auftritt!

Einen .NET 1.1 Wrapper (Aufruf: .NET 2.0-Programm -> .NET 1.1 Assembly ->
Delphi-Wrapper -> alte DLL) hab ich schon erfolglos probiert.

Ich bin wirklich für jeden Tipp dankbar, denn das ganze hat schon einige
Tage in Anspruch genommen und so langsam sollte ich das echt hinbekommen.

Viele Grüße!

xpost (diverse) und f'up2 mpdged.framework
 

Lesen sie die antworten

#1 Jochen Kalmbach [MVP]
14/05/2008 - 18:42 | Warnen spam
Hallo Merwed!

Ich habe dann versucht, die dreidimensionale Array-Struktur
linear nachzubilden und ein entsprechendes eindimensionales
Array zu übergeben.

2. Dieser Versuch ist daran gescheitert, dass die Datenmenge
des Aufrufs zu groß für den Stack war.



Warum willst Du denn den Speicher auf dem Stack allokieren?
Mach es bitte auf dem Heap!
Ein "double[][][]" ist auch nicht anderes als ein "double*".


Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/

Ähnliche fragen