2012-07-29 8 views
5

estaba intentando enviar datos manualmente a NT usando C# pero recibí un error como: "Error al inicializar la biblioteca COM (0x80010106)". ya he añadido la referencia 'Ninjatrader.Client.dll' Estoy publicar mi código de la siguiente manera:Error de iniciación de la biblioteca COM con el código 0x80010106 en C#

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); 
         } 

     } 
    } 
} 

por favor, dígame la sugerencia correcta. gracias

+0

Ver [esta pregunta SO] (http://stackoverflow.com/questions/2979113/qcroreapplication-qapplication-with-wmi) – Shai

Respuesta

1

Establezca el atributo [STAThread] en su clase Program.

Según tengo entendido, siempre que necesite objetos COM que se ejecutan en STA (Single Thread Apartment) debe especificar el STAThreadAttribute en su programa.

Puede learn more about the STAThreadAttribute from here ...

0

esto puede ser por muchas razones.
todos ellos están relacionados con el hecho de que COM Factory no puede crear su objeto.

yo tuvimos una situación en la que empiezo un programa y cogido la misma excepción si tuviera 1 de los siguientes:

  1. validación de la licencia failed
  2. notificación de copia de seguridad de base de datos apareció y el retraso en la carga del programa .
  3. Windows Server 2008R2 impedido que la aplicación para mostrar su ventana principal, debido a errores de permisos

Lo que estoy insinuando es: Comprobar lo que se impide que el NinjaTrader para cargar ...
trata de leer los registros de aplicación o eventlogs fuera ...

puede haber problemas de permisos, etc.

10

Desde el archivo de cabecera 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) 

Esto es un error en la DLL que está usando. Un archivo DLL debería nunca llamar a CoInitializeEx() en un hilo que no creó. Sin embargo, es un error bastante común y hay poco que puede hacer al respecto. Pero una cosa es que tendrá que inicializar el estado del apartamento de su cadena de modo que coincida con el que la DLL quiere para que la llamada CoInitializeEx() no falle.

  • Si realiza esta llamada en el hilo principal de su programa a continuación, cambiar el atributo en su método main(). Conviértalo en [STAThread] o [MTAThread], según lo que mantenga feliz el archivo DLL. Tenga en cuenta que esto puede ser perjudicial para su programa, debe usar [STAThread] si su programa crea cualquier ventana o utiliza cualquier otro objeto COM que requiera una STA.

  • Si realiza esta llamada en un subproceso que ha creado, llame al método SetApartmentState() del subproceso antes de iniciarlo.

  • Si hace esta llamada de un hilo de subprocesos, el método entonces no se puede cambiar el tipo de apartamento como los creados por un BackgroundWorker o de tareas, el método BeginInvoke de un delegado o el QueueUserWorkItem(), que es siempre MTA. Deberás crear un hilo en su lugar, ver la viñeta anterior.

También tenga en cuenta los requisitos del apartamento. Si el DLL solo está contento con un STA (probable), entonces debe bombear un bucle de mensaje con Application.Run(). De lo contrario, puede producirse un punto muerto o el código interno del componente simplemente no se ejecuta, esto puede ser difícil de diagnosticar.

Cuestiones relacionadas