2008. november 17.

C# dll használata Delphiből

by: Daniel Verner

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:

 

Delphi form

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.

Ossza meg ezt a cikket:

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ő!

Remaining characters

security image