我有一个COM对象SerInterface objCANinterface;它是在VC ++ 6.0 ATL中创建的 我能够从我的C#GUI成功调用这些方法。(在注册表中检查时ThreadingModel是两者)
但我创建了一个线程,必须使用在此线程内打开的此对象来继续该过程。
所以我在构造函数类中添加了以下语句
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 .__ ComObject”类型的COM对象强制转换为接口类型“MYINTERFACELib.SerInterface”。此操作失败,因为由于以下错误,对IID为“{37C34F3C-0082-46F5-9974-37CEB2E1C2EE}”的接口的COM组件的QueryInterface调用失败:加载类型库/ DLL时出错。 (来自HRESULT的异常:0x80029C4A(TYPE_E_CANTLOADLIBRARY))。
请让我知道如何解决这个问题。提前谢谢。
@ oberfreak ......... 你有没有尝试使用“as”?你用调试器下台了,类型是什么,它是预期的类型?您的interops是包含在程序集中还是单独的文件中?
@ Hans Passant: 您忘记在.rgs脚本中注册类型库,而您也没有创建代理/存根项目。两者的线程模型仍需要在STA线程上创建对象并在另一个STA线程上使用时对其进行封送处理。这往往会使创建新线程变得毫无意义。通过在工作线程上创建对象来取得进展。
@ Hans Passant:我已经注册了我的类型库和interop也是在C#中创建的,它让我在我的C#代码中使用。我无法创建一个新对象,因为我需要使用相同的对象来继续CAN序列命令。你能不能提供任何样品,以便更好地在线程中进行编组。
答案 0 :(得分:0)
我从Exe中取消注册/删除了引用,并已将注释添加回工具。然后它使用作为STA线程的参数线程传递。感谢您提出的答案。