Hey guys,
I'm attempting to write a .NET stub for a Scheme program. I want to compile the gambit scheme code down to C and then compile it into a Windows DLL. Then I can load this DLL into .NET and write an interface for it.
I've accomplished all of this (with a simple hello world program), but the .NET app always crashes. The first time I tried it, I used cygwin and compiled this scheme code:
* (c-define (helloworld) () void "helloworld" "" * (display "Hello"))
with gsc like this:
* gsc -link func.scm
and then compiled the corresponding c files with gcc like so:
* gcc -Iinclude -shared -D___DYNAMIC func*.c -o func.dll -lgambc -lwsock32 -lws2_32
which compiled fine. That should produce a Windows DLL, right? I'm a little skeptical at that part because I've never used gcc to produce a windows dll before. But read on before you think that's the problem.
As the final step I created the .NET interface with the following few lines:
* [DllImport("func.dll")] * public static extern void helloworld();
And this compiled, but .NET threw an access violation at me when the function ran. Actually, I fixed some of the gcc flags and got it instead to throw a NullReference exception when the function returned. Since I was skeptical about gcc, I tried compiling a hand-rolled ansi c file that contained the equivalent helloworld function with basically the same gcc command as above, ran the .NET program and the function ran fine (printed "Hello World" to the console). It shouldn't be anything with the calling convention or anything either since it looks like the c file produced by scheme declares the helloworld function as __cdecl. I know that the Gambit-C code includes a bunch of other stuff though (note how I had to link the winsock libraries), so it must be somewhere in there that I'm not compiling it right or something.
I found the Visual Studio solution files in the gambit directory and tried compiling gambit to a windows shared lib to see if that would help. I recompiled the Gambit-C code with visual studio and linked gambit in to a complete dll, ran the .NET app again, and now it's giving me an exception saying it can't find an entry point in the dll for the helloworld function.
There's got to be something I'm missing, has anyone else gotten this to work? Or does anyone see anything wrong with how I'm compiling the dll (the loading part is relatively simple and I doubt the problem is in there)?
Thanks, James