C#例外 - 无法投类型的COM对象.....应用程序调用这是编组为一个不同的线程
这里的接口是我的代码的简化版本C#例外 - 无法投类型的COM对象.....应用程序调用这是编组为一个不同的线程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using RDSCOMMUNICATORLib;
using System.Timers;
using System.Threading;
namespace RDSConsoleApplication
{
class Program
{
static public RDSComClass oObj = new RDSComClass();
static void Main(string[] args)
{
try
{
oObj.Host = "127.0.0.1";
oObj.Port = 2902;
oObj.LoadPiece(); // OK HERE
IConnectionEvents_OnPieceEventHandler PieceArraved = new IConnectionEvents_OnPieceEventHandler(oObj_OnPiece);
oObj.OnPiece += PieceArraved;
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
} // end main
static public void oObj_OnPiece(int lLSCRef, string strLSCName, int lPieceNumber, int bWithScans)
{
try
{
// HERE WE START GETTING EXCEPTION "Unable to cast COM object of type.....
// The application called an interface that was marshalled for a different thread"
oObj.LoadPiece();
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
}
} // end class Program
} // end namespace
我引用一个COM C#控制台应用程序中的对象,它充当连接到后端的网关并定期接收一些“块”对象。作为一个测试,当我从主要方法中尝试所有工作正常:我可以连接,接收“片”对象并访问其属性。问题是我需要从oObj_OnPiece回调方法中接收和处理相同的“片段”对象,并且它会抛出上述异常。我浏览过其他类似的帖子,我知道这是一个线程问题,但不知道如何解决它。任何帮助表示赞赏。
您尝试查询已在应用程序的其他线程中使用的接口。在你的情况下,你首先通过你的调用查询主线程中的接口。我想这是第一个线程。
事件处理程序是否可能打开不同的线程来处理事件?如果是这种情况(只需在您的事件处理程序中添加一个断点,然后尝试访问该接口,启动程序并检查是否有2个线程正在运行)。
你需要做的是:确保你只在一个线程中查询你的接口,方法是先除去对COM对象的第一个调用。
我同意,但仅在一个线程中查询接口的问题是,在第一个线程oObj.OnPiece + = PieceArraved中存在对事件的依赖关系。这是周期性触发回调的时候。同时,我需要在回调中访问oObj的一些属性以进一步处理。 – user2217057
怎样为com对象定义一个线程并通过调度器进行通信? – KimKulling
您可以尝试在Main上添加[STAThread]属性吗? https://stackoverflow.com/questions/1361033/what-does-stathread-do –
我做了,它只是阻止回调oObj_OnPiece被触发。我需要访问回调中的“块”对象。这里的问题是主方法和回调正在两个不同的线程上运行。如果我可以在单个线程上运行它们,但同时能够触发回调,那应该可以解决问题。 – user2217057