Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参考C中工作线程中的COM对象#_C#_Multithreading_Object_Com_Call - Fatal编程技术网

C# 参考C中工作线程中的COM对象#

C# 参考C中工作线程中的COM对象#,c#,multithreading,object,com,call,C#,Multithreading,Object,Com,Call,我有一个COM对象序列接口objCANinterface;它是在VC++6.0 ATL中创建的 我能够从我的C#GUI中成功地调用这些方法 但是我已经创建了一个线程,它必须使用这个线程中打开的对象来继续这个过程 因此,我在构造函数类中添加了以下语句 public MyClass() { // Start the thread with a ParameterizedThreadStart. ParameterizedThreadStart start =

我有一个COM对象序列接口objCANinterface;它是在VC++6.0 ATL中创建的 我能够从我的C#GUI中成功地调用这些方法

但是我已经创建了一个线程,它必须使用这个线程中打开的对象来继续这个过程

因此,我在构造函数类中添加了以下语句

public MyClass()
        {
 // Start the thread with a ParameterizedThreadStart.
            ParameterizedThreadStart start = new ParameterizedThreadStart(callBackLoad);
            threadFlash = new Thread(start);
            threadFlash.SetApartmentState(ApartmentState.STA);
...
}

void myFun()
{
    threadFlash.Start(objCANinterface);
   threadFlash.Join(); //Wai
}

[STAThread]
public void callBackLoad(object refinterface)
{
//I am not able to access objCANinterface inside my thread so i have passed the object as a parameter and trying to cast 
 SerInterface objSrinterface = (SerInterface)refinterface;
}
这是不成功的,请让我们知道我如何解决这个问题。我得到以下错误

MyClass.exe中发生类型为“System.InvalidCastException”的未处理异常

其他信息:无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“MYINTERFACELib.SerInterface”。此操作失败,因为对具有IID“{37C34F3C-0082-46F5-9974-37CEB2E1C2EE}”的接口的COM组件的QueryInterface调用由于以下错误而失败:加载类型库/DLL时出错。(来自HRESULT的异常:0x80029C4A(类型为E)

请让我知道如何解决这个问题。提前谢谢

@奥伯弗雷克。。。。。。。。。 你也试过用“as”吗?如果您使用调试器下台,它是哪种类型,它是预期的类型吗?您的互操作包含在程序集中还是单独的文件中

@oberfreak,我怎么用“As”,你能告诉我怎么用吗。我的互操作包括在我的exe中。我能很好地解决这个问题

@汉斯·帕桑:
您忘记在.rgs脚本中注册类型库,也没有创建代理/存根项目。当对象在STA线程上创建并在另一个STA线程上使用时,两者的线程模型仍然需要对其进行封送处理。这使得创建新线程变得毫无意义。通过在辅助线程上创建对象来获得成功


@汉斯·帕桑:我已经注册了我的类型库,并且在C#代码中创建了互操作,这使得我可以在我的C#代码中使用。我无法创建新对象,因为我需要使用相同的对象来继续执行CAN序列命令。请您提供一些样本,以便更好地在线程内部进行编组

我已从Exe中注销/删除引用,并已注册并将引用添加回工具。然后使用参数threadpassing作为STA线程。感谢您提出的答案。

您是否也使用了“as”进行了尝试?如果您使用调试器下台,它是哪种类型,它是预期的类型吗?您的互操作包含在程序集中还是单独的文件中?您忘记在.rgs脚本中注册类型库,并且您也没有创建代理/存根项目。当对象在STA线程上创建并在另一个STA线程上使用时,两者的线程模型仍然需要对其进行封送处理。这使得创建新线程变得毫无意义。通过在辅助线程上创建对象来获得成功。