异常:用CLSID创建一个COM组件的实例

本文关键字:一个 COM 组件 实例 CLSID 创建 异常 | 更新日期: 2023-09-27 18:08:34

我是一名法国实习生,我有一个非常大的问题,所以你能帮我吗?

我的项目的目标是在c#程序中从VB6编码的.dll中自动化一些测试。事实上,我从我的VB项目中使用了一些类,这将允许我们防止代码中的回归。.dll是在x86中,所以我的c#项目。

下面是我如何使用dll 的一个例子
   using E2S_Equipment;
         …
         public void verifyEquipmentTextProperty(string eqpCode, bool equipmentIsDynamic, string textPropertyCode, bool textPropertyIsDynamic, string propValue)
        {
           //Class from E2S_Equipment dll
           claEQPSRVReadString readStrService = new claEQPSRVReadString();
           readStrService.LoadByKey(eqpCode);
           …  
        }

当我在Visual Studio中启动它们时,我所有的测试都是成功的,但是当我用命令行和MSTest启动它们时,第一个测试是成功的,其他测试都是失败的。我的错误是:

System.Runtime.InteropServices。COMException:从IClassFactory创建CLSID为{987C190C-8CFD-4E41-882B-3BAE73768066}的COM组件实例失败,原因如下:

我的问题是关于claEQPSRVReadString的申报

我的第一个想法是,我的代码为每个测试创建了一个新的COM对象实例,所以我创建了一个单例模式,只有一个我的COM组件实例,像这样:

public static class SrvReadTextPropertySingleton
{
    private static claEQPSRVReadString mEqpSrvReadTextProperty;
    public static claEQPSRVReadString EqpSrvReadTextProperty
    {
        get
        {
            if (mEqpSrvReadTextProperty == null)
            {
                mEqpSrvReadTextProperty = new claEQPSRVReadString();
            }
            return mEqpSrvReadTextProperty;
        }
    }
}

现在我得到这个错误SrvReadTextPropertySingleton. EqpSrvReadTextProperty.LoadByKey(eqpCode);

System.Runtime.InteropServices。InvalidComObjectException: COM对象已与其底层RCW分离,无法使用。

那么,你有什么想法吗?

异常:用CLSID创建一个COM组件的实例

您100%确定您的项目设置是正确的吗?您的平台目标应该是x86,并且应该选中Prefer 32位复选框。另外,您是从命令行运行调试版本还是发布版本。您需要为这两个环境设置32位设置。对于命令行版本,打印以下内容以确保您的环境是正确的。

Console.WriteLine("OS {0}, Process {1}", System.Environment.Is64BitOperatingSystem, System.Environment.Is64BitProcess);

保存一个对你正在使用的对象的引用,这样你可以在使用它之前创建它,然后分配它的输出值。

var instance = new claEQPSRVReadString();
mEqpSrvReadTextProperty = instance.Value;

当然,一旦可以访问从实例中读取的值。看起来它在VB6组件的构建阶段完成了所有的工作,这是一种不寻常的方式。

是否有其他方法可以在创建的实例上使用?

我找到问题了。链接到线程执行。

在.testsettings文件中添加:

<Execution> 
  <ExecutionThread apartmentState="MTA"/>   
</Execution>
</TestSettings>
http://ralessi.wordpress.com/2013/09/11/mta-testing-on-vs2012/