Тестирование NUnit с COM-объектами для надстроек VSTO: HRESULT: 0x80004002C#

Место общения программистов C#
Anonymous
Тестирование NUnit с COM-объектами для надстроек VSTO: HRESULT: 0x80004002

Сообщение Anonymous »

Я создаю надстройку для Excel и использую NUnit для тестирования. Это представляет собой проблему, когда дело доходит до тестирования функциональности, которая взаимодействует с Excel через COM. У меня возникли проблемы с необходимыми вызовами из объектов Microsoft.Office.Interop/Core, что привело к InvalidCastException HRESULT: 0x80004002. Судя по тому, что мне удалось собрать на данный момент, это обычно возникает из-за проблемы параллелизма и необходимости запуска COM-вызовов в STA. Я пробую все, что знаю, чтобы собрать все это в одном потоке, но не могу удержаться от выдачи.
Стратегия, которую я пытаюсь использовать, состоит в том, чтобы создать экземпляр приложения (Excel) для тестирования и использовать его для тестирования моего кода.

Код: Выделить всё

using NUnit.Framework;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Excel;

[TestFixture]
[SingleThreaded]
internal class MyTest
{
Application _app;
Workbook _wb;
SomeTypedCOMObject _comThingy;

[SetUp]
[STAThread]
public void SetUp()
{
_app = new Application
{
Visible = false,
DisplayAlters = false,
};
_wb = _app.Workbooks.Add();
var obj = _wb.SomeProblematicCall // returns System.__ComObject
_comThingy = obj as SomeTypedCOMObject; // works fine
}
}
Проблема возникает, когда я пытаюсь привести тот же COM-объект в основной проект.

Код: Выделить всё

public class MyMainProjectClass
{
public SomTypedCOMObject ComThingy { get; set; }

public void MyMainProjectClass( Workbook wb )
{
ComThingy = wb.SomeProblematicCall // throws HRESULT 0x80004002
}
}
Я нашел этот вопрос, в котором рассматриваются способы заставить NUnit работать в одном потоке. Я попробовал все упомянутые предложения

Код: Выделить всё

[assembly: Apartment(ApartmentState.STA)]
[assembly: LevelOfParallelism(0)]
[assembly: NonParallelizable]
Я запускаю Visual Studio TestExplorer, а не командную строку, поэтому я не могу использовать аргумент --Agents=1, который он использует. Хотя я пытался сделать это через файл .runsettings. Не повезло. Я думаю, здесь происходит что-то еще, чего я не понимаю. При возникновении исключения вызов Thread.CurrentThread.ApartmentState возвращает STA. Так что, похоже, это не проблема совпадения. Если это имеет значение, тип, вызывающий проблему, — Microsoft.Office.Core.DocumentProperties, а вызов — Microsoft.Office.Interop.Workbook.CustomDocumentProperties. Я использую пакет NuGet:
NUnit 4.5.1
Я включил ту же ссылку на сборку из основного проекта в:
Microsoft.Office.Interop.Excel 15.0.0.0
Microsoft.Office.Core 15.0.0.0

Вернуться в «C#»