I have done some investigations (outside of NinjaTrader, just using Visual Studio c#). I do not know for sure, but it might be that the JDLLServerClass does not work on 64 bit Windows 7? I am in way over my head here, I have no idea what is going on - so apologies in advance if I am wrong.
I read this: http://blogs.msdn.com/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx So I removed the "Class" prefix from "JDLLServerClass" to end up with a program that looks like this: using System; using System.Collections.Generic; using System.Linq; using System.Text; using JDLLServerLib; using JEXEServerLib; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { // JDLLServerClass j = new JDLLServerClass(); JDLLServer j = new JDLLServer(); object result; int status = j.DoR("2| !/~i.4", out result); string.Format("J DoR ended with status {0} and result\n{1}", status, result); } } } But now I get a different error: System.Runtime.InteropServices.COMException was unhandled Message=Retrieving the COM class factory for component with CLSID {21EB05EA-1AB3-11CF-A2AC-8FF70874C460} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). Source=mscorlib ErrorCode=-2147221164 StackTrace: at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.Activator.CreateInstance(Type type) at ConsoleApplication1.Program.Main(String[] args) in c:\users\mtthwbrnd\documents\visual studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs:line 15 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: This might be relevent?: "PROBLEM: When you run the .net Code in X64 Environment you will get the following error message. " Failed --Retrieving the COM class factory for component with CLSID ...." E.g. in CMS Export / Import server side .net code = "ExportSiteContentIncremental(...) Failed --Retrieving the COM class factory for component with CLSID {CA0752B3-021C-4F99-82E3-2C0F19C5E953} failed due to the following error: 80040154." WORKAROUND: The possible workaround is modify your project's platform from 'Any CPU' to 'X86' (in Project's Properties, Build/Platform's Target) ROOTCAUSE The VSS Interop is a managed assembly using 32-bit Framework and the dll contains a 32-bit COM object. If you run this COM dll in 64 bit environment, you will get the error message. " http://blogs.msdn.com/karthick/archive/2006/02/28/540780.aspx Only problem for me here is that my visual studio only has the "x86" option. 2009/12/14 Matthew Brand <[email protected]>: > I just got a response from the NinjaTrader supoport team on their > forum to asking: > "Best course of action would be to inquiry with the author to see if > they can direct you to where it needs to be dropped." > > http://www.ninjatrader-support2.com/vb/showthread.php?p=133247#post133247 > > Is there a special place that the dll needs to be put? > > 2009/12/14 Matthew Brand <[email protected]>: >> I have added the DLL as a reference in the C# program with: >> >> right clik (in the C# IDE)->references...->add->(navigate to >> Interop.JDLLServerLib.dll) >> >> and have the lines: >> >> using JDLLServerLib; >> >> and >> >> JDLLServerClass j = new JDLLServerClass(); >> >> in my c# program. The intellisense recognises all of the things that >> are inside JDLLServerClass ... which to me inidicates that the DLL >> file was found correctly. But when I run the program I get the error: >> >> 14/12/2009 13:02:34,Strategy,Error on calling 'OnBarUpdate' method for >> strategy 'JayServerExample': Could not load file or assembly >> 'Interop.JDLLServerLib, Version=3.0.0.0, Culture=neutral, >> PublicKeyToken=null' or one of its dependencies. The system cannot >> find the file specified., >> >> It's a long shot becuase it is nothing to do with J, but does anybody >> have any ideas what I might need to do? [PS, I have only used C# since >> last week so really don't quite "get it" at this stage!] >> >> Thanks, >> Matthew. >> >> >> For reference, the c# program is: >> >> #region Using declarations >> using System; >> using System.ComponentModel; >> using System.Diagnostics; >> using System.Drawing; >> using System.Drawing.Drawing2D; >> using System.Xml.Serialization; >> using NinjaTrader.Cbi; >> using NinjaTrader.Data; >> using NinjaTrader.Indicator; >> using NinjaTrader.Gui.Chart; >> using NinjaTrader.Strategy; >> >> using JDLLServerLib; >> >> #endregion >> >> // This namespace holds all strategies and is required. Do not change it. >> namespace NinjaTrader.Strategy >> { >> /// <summary> >> /// Example of communcation with J >> /// </summary> >> [Description("Example of communcation with J")] >> public class JayServerExample : Strategy >> { >> #region Variables >> // Wizard generated variables >> // User defined variables (add any user defined variables below) >> #endregion >> >> /// <summary> >> /// This method is used to configure the strategy and is >> called once before any strategy method is called. >> /// </summary> >> protected override void Initialize() >> { >> CalculateOnBarClose = true; >> } >> >> /// <summary> >> /// Called on each bar update event (incoming tick) >> /// </summary> >> protected override void OnBarUpdate() >> { >> Print(Bars.Count); >> JDLLServerClass j = new JDLLServerClass(); >> } >> >> #region Properties >> #endregion >> } >> } >> >> >> 2009/12/12 Matthew Brand <[email protected]>: >>> That did it, thanks :-). >>> >>> PS. For anyone else with this problem, if you get a domain error when >>> you run the command: >>> wd 'exec *',BINPATH,'\jreg.bat' >>> >>> it might be that you need to run as administrator in which case execute: >>> BINPATH,'\jreg.bat' >>> >>> to see where the file is and go to it in windows explorer, right click >>> and select run as administrator. >>> >>> 2009/12/12 Dan Bron <[email protected]>: >>>> Matthew wrote: >>>>> But the JDLLServer does not appear on the COM tab for me. Is there >>>>> something I need to install first? >>>> >>>> Try running wd 'exec *',BINPATH,'\jreg.bat' . Or just double-click that >>>> batch file in Windows explorer. >>>> >>>> -Dan >>>> >>>> ---------------------------------------------------------------------- >>>> For information about J forums see http://www.jsoftware.com/forums.htm >>>> >>> >> > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
