解决由“错误加载类型库/ DLL”

时间:2019-03-30 19:55:03

标签: c# dll robot

我正在使用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();
    }

0 个答案:

没有答案