我正在使用FANUC机器人接口DLL开发软件。 DLL包含类型DataTable
,该类型需要每20毫秒(通过调用DataTable.Refresh()
)进行刷新以从机械手获取新数据。我需要在主线程之外的其他线程上执行此操作,因此我创建了一个BackgroundWorker
来调用Refresh()
方法。
在用于开发软件的PC(PC_1)上,我有一个模拟器,该模拟器创建了一个虚拟机器人,可以用来测试我的软件。该软件可与虚拟机器人一起正常使用。但是,当我移到与实际机器人连接的PC(PC_2)时,我只能使用主线程来调用DataTable.Refresh()
,并且BackgroundWorker
中调用的方法将引发以下异常: / p>
System.InvalidCastException:'无法转换类型为COM的对象 'System .__ ComObject'接口类型为'FRRJIf._DataTable'。这个 操作失败,因为对COM组件的QueryInterface调用 IID为'{F7009573-2D48-4A59-BACC-356CAF720DF0}'的接口 由于以下错误而失败:加载类型库/ DLL出错。 (来自HRESULT的异常:0x80029C4A(TYPE_E_CANTLOADLIBRARY))。'
两台PC都具有相同的DLL版本,但是PC_1运行Win10,PC_2运行Windows7。根据异常消息,原因似乎不是虚拟机器人和真实机器人之间的差异,但很可能是两台PC的软件环境不同。但是,我无法解决。
如果相关,请使用BackgroundWorker_DoWork
方法:
private DataTable _dataTable; //initialised from constructor
public BackgroundWorker DataTableBackgroundRefresher;
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
IsBusy = true;
var bgw = sender as BackgroundWorker;
try
{
while (!bgw.CancellationPending)
{
_dataTable.Refresh();
}
}
catch
{
IsBusy = false;
e.Cancel = true;
throw;
}
IsBusy = false;
e.Cancel = true;
}
测试方法很简单:
DataTable _dataTable; //initialised from Class Initilizer.
[TestMethod]
public async Task RefreshDataTable_mainThread()
{
_dataTable.Refresh();
}
[TestMethod]
public async Task RefreshDataTable_mainThread()
{
DataTableBackgroundRefresher.RunWorkerAsync();
}