Я французский стажер, и у меня действительно большая проблема, поэтому вы можете мне помочь:
Цель моего проекта - автоматизировать некоторые тесты из.dll, закодированных в VB6 в программах на С#. На самом деле я использую некоторые классы из моего проекта VB, который позволит нам предотвратить регрессии в коде. .Dll находится в x86, поэтому мой проект С#.
Вот пример того, как я использую 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: Не удалось создать экземпляр COM-компонента с CLSID {987C190C-8CFD-4E41-882B-3BAE73768066} из IClassFactory из-за следующей ошибки: 800a005b Исключение из HRESULT: 0x800A005B.
Моя проблема claEQPSRVReadString
с объявлением claEQPSRVReadString
Моя первая мысль заключалась в том, что мой код создавал для каждого теста новый экземпляр COM-объекта, и поэтому я создал шаблон Singleton, чтобы иметь только один экземпляр моего 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);
SrvReadTextPropertySingleton. EqpSrvReadTextProperty.LoadByKey(eqpCode);
,
System.Runtime.InteropServices.InvalidComObjectException: COM-объект, который был отделен от его базового RCW, не может быть использован.
Итак, у вас есть идеи? Спасибо вам заранее!
Я нашел проблему. Это связано с ссылкой на выполнение потока.
В файле.testsettings добавим:
<Execution>
<ExecutionThread apartmentState="MTA"/>
</Execution>
</TestSettings>
http://ralessi.wordpress.com/2013/09/11/mta-testing-on-vs2012/
Вы на 100% уверены, что ваши настройки проекта верны. Ваша платформа Target должна быть x86, а флажок Предпочтительный 32-разрядный флажок должен быть отмечен. Также вы запускаете версию Debug или версию выпуска из командной строки. Вам необходимо установить 32-битные настройки для обеих сред. Для версии командной строки распечатайте следующее, чтобы убедиться, что ваша среда верна.
Console.WriteLine("OS {0}, Process {1}", System.Environment.Is64BitOperatingSystem, System.Environment.Is64BitProcess);
Также может быть полезно сохранить ссылку на объект, который вы используете, чтобы создать его, прежде чем использовать его, а затем присвоить его выходному значению.
var instance = new claEQPSRVReadString();
mEqpSrvReadTextProperty = instance.Value;
Разумеется, когда можно получить доступ к значению, которое было прочитано из экземпляра. Похоже, он делает все, что он работает на этапе строительства в компоненте VB6, что является некоторым необычным способом сделать это. Есть ли у вас какие-либо другие методы для создания экземпляра.