1

我正在做一个带有 VSTO 的 Microsft PowerPoint 插件解决方案,它从硬件读取信息,硬件开发人员给了我他们的 SDK 来控制这个硬件,但我在尝试控制它时遇到了问题。

我有这个图书馆 ARS

有一堂课 ARS.BaseConnection

我有这个变量 ARS.BaseConnection BaseConn;

问题是当我创建一个类型的新对象时BaseConnection

BaseConn = new ARS.BaseConnection();

调试器没有显示任何异常,POWERPNT.exe 只是崩溃并停止。

我试图调试 POWERPNT,它说访问冲突写入位置 0x00d20f78。但我不是在编程 PowerPoint。

我发现SDK中的演示程序(实际工作)在main之前有一个[STAThread],所以我认为它必须作为STA运行所以我创建了一个新线程:

    ARS.BaseConnection BaseConn;`

    public form1()
    {
        InitializeComponent();

        System.Threading.Thread thread = new System.Threading.Thread(createBase);
        thread.SetApartmentState(System.Threading.ApartmentState.STA);
        thread.Start();
        thread.Join();

        BaseConn.Open(); // There is the problem, when I'm trying to use open() BaseConn debuger says: COM object that has been separated from its underlying RCW cannot be used.
    }

    private void createBase()
    {
        BaseConn = new ARS.BaseConnection(); //If it runs in a STA tread doesn't crash.
    }

我得到的COM 对象已与其底层 RCW 分离,无法使用。

我怎样才能使它起作用?

4

1 回答 1

0

该对象只能从其创建线程访问。

如果您需要从另一个线程访问该对象,您可以使用调度程序切换到它的线程。

考虑在主线程上创建它(首先将主线程设置为 STA)。

于 2012-06-26T18:51:38.010 回答