www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Writing a library

reply Mn <mn mailinator.com> writes:
Hello World!

Is it possible to write a library in D that can be used by other programming
languages? And if yes, how to do it? I can think of two ways of "using" a lib
in general:

1. The OOP way: use a class of the lib, then its functions, dunno how its
called.
2. The Un-OOP way: use a function of a lib, its called P/Invoke in C#.

I am only interested in the more popular languages like C, C++, Java, C#, PHP.

Greetings and thank you.
-- Mn
Feb 16 2007
parent reply "Jarrett Billingsley" <kb3ctd2 yahoo.com> writes:
"Mn" <mn mailinator.com> wrote in message 
news:er492f$1sti$1 digitalmars.com...
 Hello World!

 Is it possible to write a library in D that can be used by other 
 programming languages? And if yes, how to do it? I can think of two ways 
 of "using" a lib in general:

 1. The OOP way: use a class of the lib, then its functions, dunno how its 
 called.
 2. The Un-OOP way: use a function of a lib, its called P/Invoke in C#.

 I am only interested in the more popular languages like C, C++, Java, C#, 
 PHP.

 Greetings and thank you.
 -- Mn

No other languages understand D calling or mangling conventions, but D can make functions with C, Windows, and Pascal calling conventions. If you just do something like: extern(C) export void func(int x) { ... } You can then, maybe, make a DLL or something out of it which can be called from virtually any other mainstream language, since most things understand the C calling convention.
Feb 16 2007
next sibling parent Mn <mn mailinator.com> writes:
Jarrett Billingsley Wrote:

 "Mn" <mn mailinator.com> wrote in message 
 news:er492f$1sti$1 digitalmars.com...
 Hello World!

 Is it possible to write a library in D that can be used by other 
 programming languages? And if yes, how to do it? I can think of two ways 
 of "using" a lib in general:

 1. The OOP way: use a class of the lib, then its functions, dunno how its 
 called.
 2. The Un-OOP way: use a function of a lib, its called P/Invoke in C#.

 I am only interested in the more popular languages like C, C++, Java, C#, 
 PHP.

 Greetings and thank you.
 -- Mn

No other languages understand D calling or mangling conventions, but D can make functions with C, Windows, and Pascal calling conventions. If you just do something like: extern(C) export void func(int x) { ... } You can then, maybe, make a DLL or something out of it which can be called from virtually any other mainstream language, since most things understand the C calling convention.

Thanks for your reply. But if I now want - for example - to have three functions: openSomething(...) { connection c = pointer to an opened file } doSomething(...) { do something with c } closeSomething(...) { close connection c } How do I pass the c between these three functions? How do I ensure that c stays alive until I call closeSomething(...), and then how do I remove it? Next problem (?) is that it has to be possible to call openSomething multiple times, use doSomething with the right c multiple times and then close all the c. Sure i can just return a pointer from openSomething and pass it over to doSomething and closeSomething - but to what shall this pointer point? And where to store that? I need something persistant in the lib. How to do this? Thanks for your help. -- Mn
Feb 16 2007
prev sibling next sibling parent reply David Gileadi <foo bar.com> writes:
Jarrett Billingsley wrote:
 "Mn" <mn mailinator.com> wrote in message 
 news:er492f$1sti$1 digitalmars.com...
 Hello World!

 Is it possible to write a library in D that can be used by other 
 programming languages? And if yes, how to do it? I can think of two ways 
 of "using" a lib in general:

 1. The OOP way: use a class of the lib, then its functions, dunno how its 
 called.
 2. The Un-OOP way: use a function of a lib, its called P/Invoke in C#.

 I am only interested in the more popular languages like C, C++, Java, C#, 
 PHP.

 Greetings and thank you.
 -- Mn

No other languages understand D calling or mangling conventions, but D can make functions with C, Windows, and Pascal calling conventions. If you just do something like: extern(C) export void func(int x) { ... } You can then, maybe, make a DLL or something out of it which can be called from virtually any other mainstream language, since most things understand the C calling convention.

I tried this very thing about a year ago, creating a DLL in D with extern(C) functions which was imported and called by a C# program. It passed data back and forth via simple structs, defined on both the C# and D side. It worked great when called via a D host, but would segfault every time I tried it from the C# host. I never did figure out what was going on (and since it was a school project I just gave up and ported the code to C#). I suspected it was the fault of the garbage collector running in a separate thread, and at the time the calls to disable/enable the GC didn't do anything, so I didn't get to test if my suspicion was true. I'd be very interested to hear of your success with this.
Feb 16 2007
parent reply Mn <mn mailinator.com> writes:
David Gileadi Wrote:

 Jarrett Billingsley wrote:
 "Mn" <mn mailinator.com> wrote in message 
 news:er492f$1sti$1 digitalmars.com...
 Hello World!

 Is it possible to write a library in D that can be used by other 
 programming languages? And if yes, how to do it? I can think of two ways 
 of "using" a lib in general:

 1. The OOP way: use a class of the lib, then its functions, dunno how its 
 called.
 2. The Un-OOP way: use a function of a lib, its called P/Invoke in C#.

 I am only interested in the more popular languages like C, C++, Java, C#, 
 PHP.

 Greetings and thank you.
 -- Mn

No other languages understand D calling or mangling conventions, but D can make functions with C, Windows, and Pascal calling conventions. If you just do something like: extern(C) export void func(int x) { ... } You can then, maybe, make a DLL or something out of it which can be called from virtually any other mainstream language, since most things understand the C calling convention.

I tried this very thing about a year ago, creating a DLL in D with extern(C) functions which was imported and called by a C# program. It passed data back and forth via simple structs, defined on both the C# and D side. It worked great when called via a D host, but would segfault every time I tried it from the C# host. I never did figure out what was going on (and since it was a school project I just gave up and ported the code to C#). I suspected it was the fault of the garbage collector running in a separate thread, and at the time the calls to disable/enable the GC didn't do anything, so I didn't get to test if my suspicion was true. I'd be very interested to hear of your success with this.

You said you wrote a DLL in D and tried to access it via C#, ok. But what do you mean with "D host" and "C# host" then?? Accessing a .NET Assembly is unlikely to be possible that easy from D, although C# offers COM support. I will post a seperate reply for this topic. As far as I know there is a way to disable GC for parts of or the whole program. I will of course continue to look into this, but as of now I just started with D. Although it looks wonderful and its steep learning curve should be conquered in zero time.
Feb 16 2007
parent David Gileadi <foo bar.com> writes:
Mn wrote:
 David Gileadi Wrote:
 
 Jarrett Billingsley wrote:
 "Mn" <mn mailinator.com> wrote in message 
 news:er492f$1sti$1 digitalmars.com...
 Hello World!

 Is it possible to write a library in D that can be used by other 
 programming languages? And if yes, how to do it? I can think of two ways 
 of "using" a lib in general:

 1. The OOP way: use a class of the lib, then its functions, dunno how its 
 called.
 2. The Un-OOP way: use a function of a lib, its called P/Invoke in C#.

 I am only interested in the more popular languages like C, C++, Java, C#, 
 PHP.

 Greetings and thank you.
 -- Mn

make functions with C, Windows, and Pascal calling conventions. If you just do something like: extern(C) export void func(int x) { ... } You can then, maybe, make a DLL or something out of it which can be called from virtually any other mainstream language, since most things understand the C calling convention.

extern(C) functions which was imported and called by a C# program. It passed data back and forth via simple structs, defined on both the C# and D side. It worked great when called via a D host, but would segfault every time I tried it from the C# host. I never did figure out what was going on (and since it was a school project I just gave up and ported the code to C#). I suspected it was the fault of the garbage collector running in a separate thread, and at the time the calls to disable/enable the GC didn't do anything, so I didn't get to test if my suspicion was true. I'd be very interested to hear of your success with this.

You said you wrote a DLL in D and tried to access it via C#, ok. But what do you mean with "D host" and "C# host" then?? Accessing a .NET Assembly is unlikely to be possible that easy from D, although C# offers COM support. I will post a seperate reply for this topic. As far as I know there is a way to disable GC for parts of or the whole program. I will of course continue to look into this, but as of now I just started with D. Although it looks wonderful and its steep learning curve should be conquered in zero time.

Maybe "host" wasn't the best choice of words. I meant the .exe which loads the DLL and calls the code--i.e. in this case the C# program was the "host". I also had a program written in D to call the code in the DLL. I never tried to load a DLL written in C# from D code--as you say, this is not likely possible, at least not without some massive effort.
Feb 16 2007
prev sibling parent reply Mn <mn mailinator.com> writes:
Jarrett Billingsley Wrote:

 "Mn" <mn mailinator.com> wrote in message 
 news:er492f$1sti$1 digitalmars.com...
 Hello World!

 Is it possible to write a library in D that can be used by other 
 programming languages? And if yes, how to do it? I can think of two ways 
 of "using" a lib in general:

 1. The OOP way: use a class of the lib, then its functions, dunno how its 
 called.
 2. The Un-OOP way: use a function of a lib, its called P/Invoke in C#.

 I am only interested in the more popular languages like C, C++, Java, C#, 
 PHP.

 Greetings and thank you.
 -- Mn

No other languages understand D calling or mangling conventions, but D can make functions with C, Windows, and Pascal calling conventions. If you just do something like: extern(C) export void func(int x) { ... } You can then, maybe, make a DLL or something out of it which can be called from virtually any other mainstream language, since most things understand the C calling convention.

Is it possible to use the COM with D?
Feb 16 2007
next sibling parent BCS <BCS pathlink.com> writes:
Mn wrote:
 
 
 Is it possible to use the COM with D?

http://www.digitalmars.com/d/interface.html at the bottom
Feb 16 2007
prev sibling parent Frits van Bommel <fvbommel REMwOVExCAPSs.nl> writes:
Mn wrote:
 Is it possible to use the COM with D?

Yes. The last section of http://www.digitalmars.com/d/interface.html : --- COM Interfaces A variant on interfaces is the COM interface. A COM interface is designed to map directly onto a Windows COM object. Any COM object can be represented by a COM interface, and any D object with a COM interface can be used by external COM clients. A COM interface is defined as one that derives from the interface std.c.windows.com.IUnknown. A COM interface differs from a regular D interface in that: * It derives from the interface std.c.windows.com.IUnknown. * It cannot be the argument of a DeleteExpression. * References cannot be upcast to the enclosing class object, nor can they be downcast to a derived interface. To accomplish this, an appropriate QueryInterface() would have to be implemented for that interface in standard COM fashion. ---
Feb 16 2007