COM库初始化失败,C#中的代码为0x80010106

时间:2012-07-29 10:27:42

标签: c#

我试图使用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);
                        }
        }
    }
 }

请告诉我正确的建议。

3 个答案:

答案 0 :(得分:14)

来自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快乐的原因。请注意这可能是 对您的程序有害,如果您的程序必须使用[STAThread] 创建任何窗口或使用需要STA的任何其他COM对象。

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

  • 如果从线程池线程(例如创建的线程)进行此调用 通过BackgroundWorker或Task,委托的BeginInvoke方法或QueueUserWorkItem()方法,您无法更改公寓 类型,它总是MTA。你必须创建一个Thread,参见 上一个项目符号。

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

答案 1 :(得分:1)

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

根据我的理解,每当您需要在 STA(单线程公寓)上运行的COM对象时,您需要为您的程序指定STAThreadAttribute

您可以 learn more about the STAThreadAttribute from here ...

答案 2 :(得分:0)

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

我有一种情况,我启动一个程序,如果它有以下1个,就会发现同样的异常:

  1. 许可证验证失败
  2. 弹出数据库备份通知并延迟程序的加载。
  3. Windows Server 2008R2由于权限错误,阻止应用程序显示其主窗口
  4. 我暗示的是:检查阻止NinjaTrader加载的内容......
    尝试检查EventLogs或应用程序注销...

    可能是许可问题,等等。