-2

我有一个 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 序列命令。您能否提供任何样本以便在线程内更好地编组。

4

1 回答 1

0

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

于 2012-10-14T11:47:46.747 回答