Проблема с ссылками COM: System.Runtime.InteropServices.COMException: создание экземпляра компонента COM с CLSID

1

Я французский стажер, и у меня действительно большая проблема, поэтому вы можете мне помочь:

Цель моего проекта - автоматизировать некоторые тесты из.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, не может быть использован.

Итак, у вас есть идеи? Спасибо вам заранее!

  • 0
    Похоже, что COM-объект зарегистрирован, но сборка недоступна. Вы убедились, что сборка .NET доступна в каталоге, в котором вы работаете?
  • 0
    Средство просмотра Fusion ( msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx ) будет регистрировать ошибки привязки, когда .Net пытается найти зависимости.
Показать ещё 8 комментариев
Теги:
mstest
vb6
msbuild
com

2 ответа

0
Лучший ответ

Я нашел проблему. Это связано с ссылкой на выполнение потока.

В файле.testsettings добавим:

<Execution> 

  <ExecutionThread apartmentState="MTA"/>   

</Execution>

</TestSettings>

http://ralessi.wordpress.com/2013/09/11/mta-testing-on-vs2012/

1

Вы на 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, что является некоторым необычным способом сделать это. Есть ли у вас какие-либо другие методы для создания экземпляра.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню