C#中COM库初始化失败,错误码为0x80010106。

9

我尝试使用c#手动将数据推送到NT,但是出现了一个错误:"Failed to initialize COM library(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);
                        }
        }
    }
 }

请告诉我正确的建议。


请参见这个SO问题 - Shai
3个回答

18

来自 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。那么您将需要创建一个 Thread,请参阅上一个 bullet。

还要注意公寓的要求。如果 DLL 只接受 STA(很可能是这样),则必须使用 Application.Run() 来循环处理消息。否则可能会导致死锁,或者组件内部的代码根本不运行,这可能很难诊断。


2

0

这可能有很多原因。

所有这些原因都与COM工厂无法创建您的对象有关。

我曾经遇到这样一种情况,当程序出现以下情况之一时,我就会捕获相同的异常:

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

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

可能是权限问题等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接