c#COM对象问题

时间:2011-12-11 02:21:40

标签: c# com casting

背景

我正在使用C#在visual studio 2010上开发一个交易ActiveX API。由于它是一个ActiveX API,我只是添加了ActiveX作为我的参考。 api提供了三组内容:可用于调用API的方法,API为您更新信息的事件以及一些所谓的ActiveX COM对象。

问题

我在这里问了一个相关的问题:C# boolean int conversion issue最后,在查看异常被抛出之后,我知道它是关于强制转换的。以下是异常的描述:

*System.InvalidCastException was unhandled Message=Unable to cast object of type  
InteractiveBrokersTradingSystem.Forex' to type 'TWSLib.IContract'.

*

这是我对Forex Class的定义:

namespace InteractiveBrokersTradingSystem
{
  class Forex:TWSLib.IContract
  {


    public int conId { get; set; }
    public string symbol { get; set; }
    public string secType { get; set; }
    public string expiry { get; set; }
    public double strike { get; set; }
    public string right { get; set; }
    public string multiplier { get; set; }
    public string exchange { get; set; }
    public string primaryExchange { get; set; }
    public string currency { get; set; }
    public string localSymbol { get; set; }
    public int includeExpired { get; set; }
    public object comboLegs { get; set; }
    public object underComp { get; set; }
    public string comboLegsDescrip { get;set; }
    public string secIdType { get; set; }
    public string secId { get; set; }

    public Forex(string preCurrency,string baseCurrency)
    {
        //conId = 0;
        //symbol = preCurrency;
        //secType = "CASH";
        //expiry = null;
        //strike = double.Parse("0");
        //right = null;
        //multiplier = null;
        //exchange = "IDEALPRO";
        //primaryExchange = "IDEALPRO";
        //currency = baseCurrency;
        //localSymbol = null;
        //includeExpired = 0;
       // comboLegs = null;
        //underComp = null;
        //comboLegsDescrip = null;
        //secType = null;
        //secId = null;


      }
   }
 }

你可以看到我没有为类的属性赋值,并且无论我指定或不指定什么类型的值或者为null,异常总是相同的。

在下面作为图像的api的描述中,我们可以看到一些属性,其中()类似于strike()为doulble,而另一些属性则没有(),如secType为字符串;有人告诉我这可能有问题。请给我任何与此COM投射问题相关的提示:

a busy cat http://i.minus.com/iNIuzObDnHLJE.jpg

a busy cat http://i.minus.com/iKNApem2KXr6a.jpg

a busy cat http://i.minus.com/ib2ijVI3yGHc7H.jpg

1 个答案:

答案 0 :(得分:1)

你能发布一些实际失败的代码吗?

我认为正在发生的事情是你正在尝试将COM对象转换为普通的.NET类型而这是行不通的,因为COM对象需要通过Runtime Callable Wrapper显式地映射到.NET类型或通过手动映射。

我的一个建议是跳过显式转换并使用.NET 4.0中的动态类型来访问COM对象的属性,然后将其映射到您需要它的任何属性/对象。这样,您就能够准确地看到对象的哪个部分不想映射。