我有一个 COM 对象 SerInterface objCANinterface;它是在 VC++ 6.0 ATL 中创建的,我能够从我的 C# GUI 中成功调用方法。(在注册表中检查时,ThreadingModel 为 Both)
但是我已经创建了一个线程,它必须使用在这个线程中打开的这个对象来继续这个过程。
所以我在我的构造函数类中添加了以下语句
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”?文你下台用调试器,是什么类型,是预期的类型吗?您的互操作是否包含在程序集中或单独的文件中?
@ oberfreak,我如何使用“As”,请告诉我如何使用它。我的互操作与我的 exe 一起包含。我能够完美地摆脱困境。
@Hans Passant:您忘记在 .rgs 脚本中注册类型库,并且您也没有创建代理/存根项目。Both 的线程模型仍然需要在 STA 线程上创建对象并在另一个 STA 线程上使用时对其进行封送处理。这往往会使创建新线程变得毫无意义。通过在工作线程上创建对象来获得成功。
@ Hans Passant:我已经注册了我的类型库,并且在 C# 中也创建了互操作,这让我可以在我的 C# 代码中使用。我无法创建新对象,因为我需要使用同一个对象来继续 CAN 序列命令。您能否提供任何样本以便在线程内更好地编组。