Click here to Skip to main content
12,746,891 members (32,519 online)
Click here to Skip to main content
Add your own
alternative version


56 bookmarked
Posted 24 Feb 2009

NHunspell - Hunspell for the .NET platform

, 21 Jul 2014 LGPL3
Rate this:
Please Sign up or sign in to vote.
The spell checking and hyphenation features of OpenOffice for the .NET platform.


I was looking for a good spell checker and hyphenation library for .NET, and I found the free (LGPL licensed) Hunspell spell checker and Hyphen libraries used in OpenOffice. Hunspell wasn't available for the .NET platform. So, I decided to write a wrapper/port. It is quite nice that a lot of the OpenOffice dictionaries are LGPL licensed too and can be used in proprietary applications.

Interop code to the native Hunspell functions

I used Managed C++ to write the wrapper/port, because I could use the original source code of Hunspell and Hyphen. It was quite nice to write the interop code between managed classes and the unmanaged Hunspell and Hyphen libraries. The original source code is almost unchanged, so that new versions of Hunspell or Hyphen can be easily adopted. Hunspell and Hyphen use unmanaged memory functions, so I had to implement the IDisposable interface and used this pattern to free unmanaged memory early.

Because Hunspell uses UTF8 coding, I had to provide conversion functions from/to UTF8:

char * NHunspell::MarshalHelper::AllocUTF8FromString(String ^value)
    array<Byte> ^ byteArray = Encoding::UTF8->GetBytes(value);
    int size = Marshal::SizeOf(byteArray[0]) * (byteArray->Length + 1);
    IntPtr buffer = Marshal::AllocHGlobal(size);
    Marshal::Copy(byteArray, 0, buffer, byteArray->Length);
    Marshal::WriteByte(buffer, size - 1, 0);
    return (char *) buffer.ToPointer();

String ^ NHunspell::MarshalHelper::AllocStringFromUTF8( char * value )
    int size = strlen(value);
    array<Byte> ^ byteArray = gcnew array<Byte>(size);
    Marshal::Copy(IntPtr(value), byteArray, 0, size);
    return Encoding::UTF8->GetString(byteArray);

Another big thing is to handle the unmanaged memory. I implement destructors and finalizers to deal with this:


    if( handle != 0 )
        delete handle;
        handle = 0;

bool NHunspell::Hunspell::IsDisposed::get()
    return handle == 0;

NHunspell spell checking and hyphenation sample

This is a short demo of how to use NHunspell for spell checking, suggestions, and hyphenation:

Console.WriteLine("NHunspell functions and classes demo");

Console.WriteLine("Spell Check with with Hunspell");

// Important: Due to the fact Hunspell will use unmanaged memory
// you have to serve the IDisposable pattern
// In this block of code this is be done
// by a using block. But you can also call hunspell.Dispose()
using (Hunspell hunspell = new Hunspell("en_us.aff", "en_us.dic"))
    Console.WriteLine("Check if the word 'Recommendation' is spelled correct"); 
    bool correct = hunspell.Spell("Recommendation");
    Console.WriteLine("Recommendation is spelled " + 
              (correct ? "correct" : "not correct"));

    Console.WriteLine("Make suggestions for the word 'Recommendatio'");
    List<string> suggestions = hunspell.Suggest("Recommendatio");
    Console.WriteLine("There are " + suggestions.Count.ToString() + 
                      " suggestions" );
    foreach (string suggestion in suggestions)
        Console.WriteLine("Suggestion is: " + suggestion );

Console.WriteLine("Hyphenation with Hyph");

// Important: Due to the fact Hyphen will use unmanaged
// memory you have to serve the IDisposable pattern
// In this block of code this is be done by a using block.
// But you can also call hyphen.Dispose()
using (Hyphen hyphen = new Hyphen("hyph_en_us.dic"))
    Console.WriteLine("Get the hyphenation of the word 'Recommendation'"); 
    HyphenResult hyphenated = hyphen.Hyphenate("Recommendation");
    Console.WriteLine("'Recommendation' is hyphenated as: " + 
                      hyphenated.HyphenatedWord ); 

Console.WriteLine("Press any key to continue...");

Because Hunspell is native C++ code, you must include the correct assembly for your platform. On x86 platforms (32 bit), use the NHunspell.dll from the X86 folder. On X64 platforms, use the NHunspell.dll from the X64 folder.


This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


About the Author

I'm working on a new project called Crawler-Lib. It is a generalized back-end processing and hosting framework for Microsoft .NET and Mono. Please take a look at it:
Crawler-Lib Homepage
Crawler-Lib Blog
Crawler-Lib YouTube Channel

You may also be interested in...

Comments and Discussions

QuestionError when using with Karbon CMS Pin
bosfan16-Feb-17 4:20
memberbosfan16-Feb-17 4:20 
QuestionHyphenation priority Pin
Yves Goergen27-Jan-15 5:04
memberYves Goergen27-Jan-15 5:04 
AnswerRe: Hyphenation priority Pin
Thomas Maierhofer (Tom)5-Feb-15 1:08
memberThomas Maierhofer (Tom)5-Feb-15 1:08 
QuestionCan we get grammar suggestions using this library? Pin
Nitin Sawant29-Nov-12 19:56
memberNitin Sawant29-Nov-12 19:56 
AnswerRe: Can we get grammar suggestions using this library? Pin
Thomas Maierhofer18-Mar-13 12:32
memberThomas Maierhofer18-Mar-13 12:32 
QuestionForm Resize issue Pin
Scott Logan11-Nov-11 2:07
memberScott Logan11-Nov-11 2:07 
QuestionStrange hang Pin
jarofkla15-Dec-10 5:53
memberjarofkla15-Dec-10 5:53 
GeneralAFF File not found Pin
hemaprathima24-Nov-10 21:01
memberhemaprathima24-Nov-10 21:01 
General"Stack empty" error every now and then with v0.9.6 Pin
Rune Jacobsen13-Oct-10 21:24
memberRune Jacobsen13-Oct-10 21:24 

In my web app, I have some javascript that sends text from a textarea to the server using ajax when there has been no typing for 250ms, to update a div that shows spell-checked text. This works fine for the most part.

However, every now and then, the code throws an InvalidOperationException. When it happens, it usually happens quite a few times in a row, then suddenly it stops happening again.

All I have is what little ELMAH has salvaged from the exception:

System.InvalidOperationException: Stack empty.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at NHunspell.SpellFactory.Spell(String word)
at EuroSpell.LanguageAnalyzer.WordIsSpelledCorrectly(LanguageName language, String word)

(The EuroSpell stuff is obviously my code, with more of the same following)

The surprising stuff is that this comes and goes - it works perfectly fine in 97% of the requests (number made up, but probably within 10% of the correct value), and then suddenly doesn't work for a little while.

My own logs show that this rarely happens on the first word in a request (I am looping through all the words posted, naturally), it some times happens towards the end of the stream of words.

My problem is basically that I don't know why this happens, and can't seem to find out from the exception data either. Is there a way to debug myself out of this?
GeneralRe: "Stack empty" error every now and then with v0.9.6 Pin
Thomas Maierhofer14-Oct-10 4:37
memberThomas Maierhofer14-Oct-10 4:37 
GeneralRe: "Stack empty" error every now and then with v0.9.6 Pin
Rune Jacobsen18-Oct-10 1:33
memberRune Jacobsen18-Oct-10 1:33 
GeneralRe: "Stack empty" error every now and then with v0.9.6 Pin
Thomas Maierhofer18-Oct-10 1:52
memberThomas Maierhofer18-Oct-10 1:52 
GeneralRe: "Stack empty" error every now and then with v0.9.6 Pin
Rune Jacobsen18-Oct-10 2:03
memberRune Jacobsen18-Oct-10 2:03 
GeneralNHunspell Version 0.9.5 released Pin
Thomas Maierhofer19-Jul-10 0:05
memberThomas Maierhofer19-Jul-10 0:05 
GeneralProblem loading the native DLL Pin
Rune Jacobsen1-Jul-10 2:08
memberRune Jacobsen1-Jul-10 2:08 
GeneralRe: Problem loading the native DLL Pin
Thomas Maierhofer18-Jul-10 23:50
memberThomas Maierhofer18-Jul-10 23:50 
GeneralRe: Problem loading the native DLL Pin
Rune Jacobsen11-Aug-10 0:41
memberRune Jacobsen11-Aug-10 0:41 
QuestionSom question that i have Pin
Viki Vic1-Jun-10 23:34
memberViki Vic1-Jun-10 23:34 
AnswerRe: Som question that i have Pin
Thomas Maierhofer18-Jul-10 23:59
memberThomas Maierhofer18-Jul-10 23:59 
GeneralProblem exporting solution Pin
yunou13-May-10 13:59
memberyunou13-May-10 13:59 
GeneralRe: Problem exporting solution Pin
Thomas Maierhofer19-Jul-10 0:01
memberThomas Maierhofer19-Jul-10 0:01 
GeneralNot Working in Windows Form Pin
mouthpiec7-Mar-10 7:29
membermouthpiec7-Mar-10 7:29 
GeneralRe: Not Working in Windows Form Pin
mouthpiec7-Mar-10 7:47
membermouthpiec7-Mar-10 7:47 
GeneralRe: Not Working in Windows Form Pin
mouthpiec7-Mar-10 8:47
membermouthpiec7-Mar-10 8:47 
GeneralHunspell class Add method not working Pin
mrmans0n23-Feb-10 9:20
membermrmans0n23-Feb-10 9:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.170215.1 | Last Updated 21 Jul 2014
Article Copyright 2009 by Thomas Maierhofer (Tom)
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid