When you call a J# DLL from .NET 4.0 (or later) code, you will get an error that vjsnativ.dll could not be located. The work-around to date has been to copy vjsnativ.dll to the directory of the primary application calling the code. For an app this is workable althogh a bit if a pain. But for web apps this can be very problematic as you're talking the underlying web server.
It turns out there's a much easier approach. The following code needs to be called in your C# code before instantiating any classes or calling any code in a J# DLL. After you call this, you can then call all of your J# code. The trick is simple – you load the library explicitly and then Windows already knows its location.
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr LoadLibrary(string lpFileName);
static void Main(string args)
if (Environment.Version.Major >= 4)
string folder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), @"..\Microsoft.NET\Framework\v2.0.50727");
folder = Path.GetFullPath(folder);
// now call J# code
What we have done for Windward Reports (our kick-ass reporting & docgen system - and can be called directly from J# – check it out) is place this code in the static constructor of our main C# wrapper class. That class is how our customers access our J# code, so it is always called before any calls are passed down to the J# DLL. By placing this inside our wrapper, users don't even need to include this code snippet. But if you provide your J# code directly, then your users will need to explicitly call this code before calling any of the J# code.