异常:用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分离,无法使用。
那么,你有什么想法吗?
您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/