COM库启动失败,代码0x80010106在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); } } } } 

请告诉我正确的建议。 谢谢

从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,请参阅上一个项目符号。

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

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

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

您可以从这里了解有关STAThreadAttribute的更多信息 ……

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

我有一个情况,我启动一个程序,如果它有以下1个,则捕获相同的exception:

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

我暗示的是:检查阻止NinjaTrader加载的内容……
尝试检查EventLogs或应用程序注销…

可能是许可问题,等等。