C# 可以使用“a”吗;“处理”;有助于防止;系统无效卡斯特例外“;?

C# 可以使用“a”吗;“处理”;有助于防止;系统无效卡斯特例外“;?,c#,com,activex,handle,C#,Com,Activex,Handle,我刚开始用C#编程,所以我的问题可能是因为我缺乏知识 我正试图用我的C#程序控制一个科学实验装置。设备的生产者提供一个ActiveX API,其中包含控制设备所需的所有类和方法。 初始化过程的基本思想如下: 创建类别为class1的object1 运行object1.initialize()方法(如果成功,则返回int=0) 运行object1.detect()方法(如果成功,则返回int=0) 运行object1.getInterface(string serialNo)方法(应返回进一步控制

我刚开始用C#编程,所以我的问题可能是因为我缺乏知识

我正试图用我的C#程序控制一个科学实验装置。设备的生产者提供一个ActiveX API,其中包含控制设备所需的所有类和方法。 初始化过程的基本思想如下:

  • 创建类别为class1的object1
  • 运行object1.initialize()方法(如果成功,则返回int=0)
  • 运行object1.detect()方法(如果成功,则返回int=0)
  • 运行object1.getInterface(string serialNo)方法(应返回进一步控制所需的class2类型的对象)
  • 我的问题在第四步。在Microsoft Visual Studio 2010的“对象浏览器”中,它表示此方法:

    public virtual class2 getInterface(string serialNo)
    
    所以我首先假设这种代码应该可以工作:

    public class1 object1 = new class1();
    public class2 object2;
    
    public void initialize()
    {
     int initInt = object1.initialize();
     int devInt = object1.detect();
     string serialNo = object1.DeviceList[0].ToString(); 
    // I am able to read this string and it is the correct serial number!
     object2 = object1.getInterface(serialNo);
    
    但在运行程序时,这会导致“System.InvalidCastException”,并且我的object2保持为空

    在该API的用户手册中,设备的生产者谈到了“getInterface(string)”函数,它返回设备子对象的句柄。 根据定义,它进一步说明(我不知道是哪种语言):

    我在C#中查找了一些句柄,但我总是混淆句柄、指针和引用。也许你可以给我一页,让我用一种简单的方式来研究它们之间的差异

    此外,我正在寻找如何在不使用InvalidCastException的情况下创建object2的技巧。如何使用手柄?还是应该使用指针

    非常感谢你的帮助

    编辑:异常的整个消息是:

    System.InvalidCastException: Return argument has an invalid type. at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType) at
    System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue)
    at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
    at thUsedCOMLib.class1.getInterface(String serialNo) at MyProject.Form1.initialize() in path/to/my/file.cs:line 00
    

    getInterface函数返回一个指向class2类型对象的指针。您可以使用C#的不安全构造来定义指针(有关不安全访问的更多信息)

    注意:不要忘记在项目中允许不安全代码(右键单击项目->属性>构建->选中“允许不安全代码”)。
    如果在类2中没有任何引用类型字段,可以使用struct而不是class(我们不能在引用类型上有指针)。如果结构上没有任何引用类型字段,则允许在结构上使用指针。

    如果混淆了太多有用的信息,异常消息将告诉您有关强制转换失败原因的更多信息。在您的程序中找到Main()方法并在其上放置[StatThread]属性。嗨,Hans,我在我的问题中添加了整个异常消息!Main()方法中已经存在[StatThread]属性。您好,SargisKoshkaryan,谢谢您的回答!我现在的问题是无法声明指向托管类型对象的指针(我尝试了:fixed(class2*object2Ptr=object1.getInterface(serialNo)))。您知道如何获取指针吗?抱歉,我没有意识到按enter键会立即发布-请参阅我的编辑;-)是的,您正在编写,我们不能使用指针引用类型。如果在类2中没有任何引用类型字段,可以使用struct而不是class。如果结构上没有任何引用类型字段,则允许使用指针。
    System.InvalidCastException: Return argument has an invalid type. at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType) at
    System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue)
    at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
    at thUsedCOMLib.class1.getInterface(String serialNo) at MyProject.Form1.initialize() in path/to/my/file.cs:line 00