9

我试图使用 c# 手动将数据推送到 NT,但出现错误:“无法初始化 COM 库(0x80010106)。” 我已经添加了参考'Ninjatrader.Client.dll' 我发布我的代码如下:

using System;
using System.Runtime.InteropServices;
using System.Threading; 
using System.Diagnostics;

namespace read_file
{
 public static class Program
 {
    [DllImport("NtDirect.dll", EntryPoint = "Connected", SetLastError = true)]
    public extern static int Connected(int showMessage);

    [DllImport("NtDirect.dll", SetLastError = true)]
    public static extern int Last(string instrument, double price, int size);

    public static void Main(string[] args)
    {
        NinjaTrader.Client.Client NTClient = new NinjaTrader.Client.Client();
        int ConnectStatus = Connected(1);

        NTClient.Command("PLACE", "Sim101", "ES 03-08", "BUY", 1, "LIMIT", 1245.00, 0,   "GTC", "ax1234", "", "", "");
        int k;
        for (int i = 0; i < 100; i++)
        {
            k = 10 * (i + 1);
            Last("AUDUSD", k, 4);
            for (int j = 0; j < 999999999; j++)
            {
            }
            Console.WriteLine(k);
                        }
        }
    }
 }

请告诉我正确的建议。

4

3 回答 3

17

从 WinError.h SDK 头文件:

//
// MessageId: RPC_E_CHANGED_MODE
//
// MessageText:
//
// Cannot change thread mode after it is set.
//
#define RPC_E_CHANGED_MODE               _HRESULT_TYPEDEF_(0x80010106L)

这是您正在使用的 DLL 中的一个错误。DLL 不应该在它没有创建的线程上调用 CoInitializeEx()。然而,这是一个相当常见的错误,您对此无能为力。但有一件事,您必须初始化线程的单元状态,使其与 DLL 所需的状态相匹配,这样 CoInitializeEx() 调用就不会失败。

  • 如果您在程序的主线程上进行此调用,则更改 Main() 方法上的属性。使其成为 [STAThread] 或 [MTAThread],这取决于使 DLL 满意的原因。请注意,这可能对您的程序有害,如果您的程序创建任何窗口或使用任何其他需要 STA 的 COM 对象,则必须使用 [STAThread]。

  • 如果在创建的线程上进行此调用,则在启动线程之前调用线程的 SetApartmentState() 方法。

  • 如果您从线程池线程(例如由 BackgroundWorker 或 Task、委托的 BeginInvoke 方法或 QueueUserWorkItem() 方法创建的线程池线程)进行此调用,则您无法更改单元类型,它始终是 MTA。您将不得不创建一个线程,请参阅上一个项目符号。

还要注意公寓的要求。如果 DLL 只对 STA 满意(可能),那么您必须使用 Application.Run() 泵送消息循环。不这样做会导致死锁或组件内部的代码无法运行,这可能很难诊断。

于 2012-07-29T13:58:47.200 回答
2

将属性设置[STAThread]为您的类Program

据我了解,每当您需要在STA(单线程单元)上运行的 COM 对象时,您都需要STAThreadAttribute为您的程序指定。

您可以从此处了解有关 STAThreadAttribute 的更多信息...

于 2012-07-29T11:56:53.060 回答
0

这可能有很多原因。
所有这些都与 COM 工厂无法创建您的对象这一事实有关。

我有一种情况,我启动一个程序并捕获相同的异常,如果它有以下之一:

  1. 许可证验证失败
  2. 弹出数据库备份通知,延迟了程序的加载。
  3. Windows Server 2008R2 由于权限错误而阻止应用程序显示其主窗口

我暗示的是:检查是什么阻止了 NinjaTrader 加载...
尝试检查事件日志或应用程序注销...

可能是权限问题等

于 2012-07-29T12:07:42.967 回答