См. Обновление ниже, прежде чем читать!
У меня есть класс, чтобы получить экземпляр работающего приложения для работы с API этого приложения. Кажется, что он работает нормально в режиме отладки. Когда я запускаю модульные тесты, кажется, что он не может получить доступ к приложению.
Я получаю исключение:
System.Runtime.InteropServices.COMException: операция недоступна ( Исключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
Во-первых, позвольте мне сказать, что я понимаю, что если мой тест основан на внешнем приложении, то технически это не «модульный тест». В этом случае использование фреймворка для тестирования кода все еще очень полезно. Единственный другой способ, который я знаю, - это просто запустить и использовать контрольные точки для проверки значений или просто посмотреть, получу ли я желаемый результат. Вот так я и вырастил свои навыки и, честно говоря, это отстой. Таким образом, я пропустил много ошибок.
Мой код в классе, который является проблемой при тестировании:
if(solidWorksApp == null)
{
string progId = "SldWorks.Application";
solidWorksApp = System.Runtime.InteropServices.Marshal.GetActiveObject(progId) as ISldWorks;
}
Я запускаю приложение в модульном тесте, используя следующее:
[TestInitialize]
public void TestInitialize()
{
var progId = "SldWorks.Application";
var progType = System.Type.GetTypeFromProgID(progId);
app = System.Activator.CreateInstance(progType) as ISldWorks;
app.Visible = true;
DocumentSpecification documentSpecification;
documentSpecification = (DocumentSpecification)app.GetOpenDocSpec(fullFilePath);
documentSpecification.DocumentType = (int)swDocumentTypes_e.swDocPART;
var result = app.OpenDoc7(documentSpecification);
if (result == null)
{
throw new Exception("Couldn't load SOlidworks test file.");
}
}
Почему я не смогу получить доступ к приложению, когда оно запускается модульным тестом? Есть ли обходной путь?
Обновление: Я попытался запустить приложение в обычном режиме и затем получить указатель на приложение в моем тесте с помощью Marshal.GetActiveObject. Это все еще не сработало. Затем я попытался запустить приложение вручную как администратор и Marshal.GetActiveObject. Я тогда смог получить приложение. Кажется, это проблема с разрешениями.