[Jprogramming] C# .NET COM JDLLServer
Matthew Brand
mtthwbrnd at googlemail.com
Wed Dec 16 00:19:30 HKT 2009
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 <mtthwbrnd at googlemail.com>:
> 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 <mtthwbrnd at googlemail.com>:
>> 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 <mtthwbrnd at googlemail.com>:
>>> 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 <j at bron.us>:
>>>> 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
>>>>
>>>
>>
>
More information about the Programming
mailing list