我试图使用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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
请告诉我正确的建议.
Han*_*ant 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)
Run Code Online (Sandbox Code Playgroud)
这是您正在使用的DLL中的错误.DLL 永远不应该在它没有创建的线程上调用CoInitializeEx().这是一个相当常见的错误,但你无能为力.但有一点,你必须初始化线程的单元状态,以便它与DLL所需的状态相匹配,这样CoInitializeEx()调用就不会失败.
如果在程序的主线程上进行此调用,则更改Main()方法的属性.使它[STAThread]或[MTAThread],取决于保持DLL快乐的原因.请注意,这可能对您的程序有害,如果您的程序创建任何窗口或使用需要STA的任何其他COM对象,则必须使用[STAThread].
如果在您创建的Thread上进行此调用,则在启动之前调用线程的SetApartmentState()方法.
如果从线程池线程(例如BackgroundWorker或Task创建的线程),委托的BeginInvoke方法或QueueUserWorkItem()方法进行此调用,则无法更改单元类型,它始终是MTA.您将不得不创建一个Thread,请参阅上一个项目符号.
还要注意公寓的要求.如果DLL只对STA(可能)感到满意,那么您必须使用Application.Run()泵送消息循环.如果不这样做会导致组件内部死锁或代码无法运行,这可能很难诊断.
将属性设置[STAThread]为您的班级Program。
根据我的理解,每当您需要在STA(单线程单元)上运行的 COM 对象时,您都需要STAThreadAttribute为您的程序指定 。
您可以从这里了解有关 STAThreadAttribute 的更多信息...
| 归档时间: |
|
| 查看次数: |
9685 次 |
| 最近记录: |