C#
Bizonyos esetekben szükség lehet olyan megoldásra, amely segítségével Delphi programból használhatunk C#-ban készített dll-t. Egyszerű példa erre, egy meglévő C# applikáció kibővítése win32-es kapcsolódási felülettel.
Egy natív win32-es applikáció összekapcsolása .NET alkalmazással nem olyan egyszerű feladat, mint egy sima win32-es dll esetében. A cikk egy példaprogram segítségével mutatja be a C# Delphi interakciót com object-ek használatával.
A C# program két egyszerű függvénnyel rendelkezik, az első két egész szám összeadását végzi, a másik megjelenít egy MessageBox-ot. Ahhoz, hogy el tudjuk érni az imént említett funkciókat, definiálni kell egy interface-t, amely tartalmazza az említett függvények deklarációját:
public interface IExampleFunctions
{
int Add(int arg1, int arg2);
void ShowManagedMessageBox(string message);
}
A class definíciójánál a [ClassInterface(ClassInterfaceType.None)] attribútum használatával érjük el, hogy az általunk definiált interface kerüljön a com objectbe és ne automatikusan generálódjon.
[ClassInterface(ClassInterfaceType.None)]
public class ExampleFunctions : IExampleFunctions
{
public int Add(int arg1, int arg2)
{
return arg1 + arg2;
}
public void ShowManagedMessageBox(string message)
{
MessageBox.Show(message);
}
}
Következő lépésben az AssemblyInfo.cs fájlban kell beállítani, hogy az interface-ünk látható legyen a com objectből:
[assembly: ComVisible(true)]
A type library fájlt legenerálhatjuk command line-ból is, de egyszerűbb megoldás a Visual Studio project beállítások között kiválasztani a Register for COM interop opciót:
Project Properties->Build->Register for COM interop
Ezt a megoldást Visual Studio 2008-ban teszteltem, gondolom, hogy régebbi verzióknál is működik, ha nem akkor a következő paranccsal is dolgozhatunk:
regasm filename.dll /tlb:filename.tlb
A regasm.exe a .NET SDK része, esetemben a C:WindowsMicrosoft.NETFrameworkv2.0.50727 mappában.
A regasm csak a saját gépünkön regisztrálja a fájlt, ám ha más gépen akarjuk használni a programot (ami általában cél :-), az adott gépen is regisztrálni kell, ezt reg fájl alkalmazásával érhetjük el, amit a következőképp generálunk le:
RegAsm.exe filename.dll /regfile:filename.reg
Tipp: A reg fájl generálását is automatizálhatjuk. A project beállításai között létre lehet hozni fordítás előtti és fordítás utáni eseményeket. Esetünkben fordítás utáni eseményre van szükség. Project Properties->Build Events->Post Build event:
C:WindowsMicrosoft.NETFrameworkv2.0.50727RegAsm.exe
$(TargetDir)$(TargetFileName) /regfile:CallFromDelphi.reg
Delphi
Első lépésként importáljuk Deplhi-be a type libraryt:
Project->Import Type library
Kiválasztjuk az előzőekben létrehozott type libraryt (.tlb), majd a Create unit gombra kattintva, delphi unitot generálunk belőle. A delphi program mindössze két gombból, és két szövegmezőből áll:

A form elkészítését az olvasóra bízom. A függvények használatához a uses listát kibővítjük az imént legenerált unittal: FileName_TLB és a ComObj unittal.
A függvények meghívása a következik:
intfRef: IExampleFunctions;
intfRef := CreateComObject(CLASS_ExampleFunctions) as IExampleFunctions;
result: Integer;
result := intfRef.Add(StrToInt(editArg1.Text), StrToInt(editArg2.Text));
Application.MessageBox( PChar('Result from C#: ' + IntToStr(result)),'Result from
dotNet', MB_ICONMASK + MB_OK );
intfRef.ShowManagedMessageBox('This is a C# messagebox, called from Delphi!');
A példában csak integer és string paramétereket használtam, más adattípusok használata is lehetséges, mint Boolean vagy Array, az utóbbi használatához az AciveX unit is szükséges.
Hozzászólások
Ehhez a hírhez még senki sem szólt hozzá. Legyen Ön az első!
Szóljon hozzá
HTML kód használata nem engedélyezett, de a webcímek automatikusan át lesznek alakítva linkekké. Az e-mail cím soha nem lesz publikálva.. A hozzászólások moderálási jogát fenntartjuk. Az avatarok megjelenítéséhez a Gravatar szolgáltatást használjuk. Töltse föl képét itt: www.gravatar.com.
Minden *-al jelölt mező kitöltése kötelező!