[sword-devel] Sword C# bindings for Windows

Jon Behrens jbb at crimsonthread.com
Mon Sep 22 13:28:06 MST 2014

I've finally gotten the C# binding examples to run both on Linux and 
Windows. This means,
of course, that one should be able to write C# code on either platform 
and have the resulting
application also run on either. (At least at this point the C# examples 
packaged with the Sword
distribution run on both platforms using identical C# code.)

I've written a tutorial outlining the steps needed to accomplish this. 
That's attached as a
text file. Would it be appropriate to add this to the developer's wiki?

Be blessed,

-------------- next part --------------
Making Sword C# Bindings for windows

1. Set up Sword for windows according to these instructions:

Except, stop before making libsword.sln, you will need to make some changes before
the project will build successfully.

2. Open \sword\sword\lib\vcppmake\libsword.sln in VS2013 and allow the project to
be converted.

3. Open the project properties window

	3.1 Under the C/C++ tab General, edit additional include directories
		Change icu-sword to icu
	3.2 Under the Linker tab General, edit additional library directories
		Change libcurl-vc10-x86-release-static-ipv6-sspi-spnego-winssl/lib to
		Change icu-sword/lib to icu/lib
4. In the Solution Explorer window, drag the file: sword\bindings\flatapi.cpp
into the solution.

5. Open flatapi.h 

	5.1 Replace all ' * SWDLLEXPORT ' with ' SWDLLEXPORT * ' (without the quotes)
	5.2 Replace all ' ** SWDLLEXPORT ' with ' SWDLLEXPORT ** ' (without the quotes)
	5.3 Declare the following function:
	SWHANDLE SWDLLEXPORT org_crosswire_sword_SWMgr_newWithPath(const char *thePath);

6. Open flatapi.cpp

	6.1 Make the replacements as in step 5
	6.2 Change all ::clearModInfo to clearTheModInfo (remove the colons and rename)
	6.3 Change the declaration of clearModInfo in the unnamed namespace to clearTheModInfo
	6.4 Define the function in 5.3 above:
	SWHANDLE SWDLLEXPORT org_crosswire_sword_SWMgr_newWithPath(const char *thePath) {
		SWConfig *sysConf = new SWConfig(thePath);
		return (SWHANDLE) new HandleSWMgr(new WebMgr(sysConf));
7. At this point, libsword.sln should make without errors - either release or debug.

8. In the Sword distribution, there is a bindings directory having a csharp directory.
In that directory, edit the file NativeMethods.cs:

	8.1 In the NativeMethods class the DLLNAME changes from libsword.so to libsword.dll
	8.2 In the NativeMethods class change:
		[DllImport(DLLNAME)] to
		[DllImport(DLLNAME, CallingConvention=CallingConvention.Cdecl)]
9. Put all of the dlls in the sword project where C# can find them. Quick and dirty is to
copy them all to the bin directory for the executable you will build. You may need the 
following dlls (I don't know yet which dlls do what, so I've included them all from the
Windows build of the Sword distribution. This list works, a lesser list may be sufficient.):

	icule53.dll		clucene-core.dll	icudt53.dll		icuuc53.dll
    liblzma.dll		icuio53.dll			icuin53.dll		binding.dll
    icutu53.dll		iculx53.dll			clucene-shared.dll
    libsword.dll	libbz2.dll
10. Figure out where you want your data files and edit sword.conf to point to that 
directory. Also put sword.conf somewhere reasonable.

11. In sword\bindings\csharp\examples edit LookupExample.cs
	using (var manager = new manager()) //changes to
	using (var manager = new manager(@"path to sword.conf"))

More information about the sword-devel mailing list