2009-11-09 3 views
2

Я пытаюсь запустить автоматические тесты для определенного продукта. Тест состоит из установки продукта в разные места на жестком диске, а затем выполнения некоторых операций над ним, а затем закрытия приложения.Как разгружать сборки из GAC?

Код, который запускает процесс выглядит следующим образом:

using (Process process = new Process()) 
      { 
       process.StartInfo.FileName = "C:\mylocation\myapp.exe"; 
       process.Start(); 
      } 

При выполнении тестов непрерывно, когда место установки приложения изменится, я получаю исключение из приведенного выше кода, который говорит:

Ограничение API: сборка 'файл: /// C: \ alternate_location \ myapp.exe' уже загружен из другого . Он не может быть загружен с нового места в пределах того же appdomain.

Из-за этого испытания не могут выполняться непрерывно.

Что можно сделать, чтобы преодолеть это? В любом случае я могу разгрузить сборки из GAC?

Могу ли я что-то сделать в своем тестовом приложении для преодоления этого ИЛИ, что-то нужно изменить в приложении, которое я тестирую?

+0

BTW вы не загрузите материал в GAC, вы «зарегистрируете» или «добавите». Следовательно, вы не «выгружаете», вы «удаляете» (Отсюда путаница в ответе Конамимана) –

+0

Хорошо. Спасибо за исправление. – Poulo

+0

Какую тестовую среду вы используете? – serialhobbyist

ответ

1

Вы не можете выгружать сборки из домена приложения после загрузки. Но вы можете создать новый домен приложения (AppDomain class), загрузить сборки внутри него, использовать их, а затем выгрузить домен. Смотрите здесь: Good example of use of AppDomain

+1

Это не имеет отношения к AppDomains. Она имеет в виду GAC –

+0

Может ли + 1er объяснить причину ответа? (Я удалю свои комментарии и/или -1, если есть веская причина ...) –

+0

Перечитайте вопрос, он имеет все, что связано с AppDomains и мало что касается GAC. К сожалению слишком поздно, чтобы отменить мой -1 ...Может кто-то выбросить +1, чтобы отменить пожалуйста: P –

1

Добавление что-то в GAC не является неотъемлемой частью определения компоненты - это обычно делаются установщиком и т.д.

Инструмент gacutil может быть использован для удаления вашего инструмента из GAC. В 1.1 это было в директории Framework. В более новых версиях его в SDK, например, C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin

+0

Но я удаляю приложение после каждого тестового примера. (иначе мне не разрешат устанавливать другую копию). Так что, если удаление не позаботится об удалении, если установка добавила сборку в GAC? Кроме того, я, похоже, не могу воспроизвести проблему при выполнении тестов вручную. Так что это похоже на проблему с синхронизацией. Итак, предлагаете ли вы использовать инструмент для удаления сборки из GAC после каждого теста? Это может быть нецелесообразно для меня, потому что я запускаю тесты на машинах, на которых установлена ​​только платформа .NET. (Нет VS и SDK) Есть ли какой-нибудь выход? – Poulo

+0

Похоже, здесь много путаницы. Вы уверены, что вкладываете вещи в GAC? Исключение, которое вы получаете, связано с попыткой загрузить одну и ту же DLL из разных мест в один и тот же AppDomain, что может быть связано с тем, что несколько тестов выполняются в том же контексте [AppDomain]. Ответ Конамимана правильный. Вы должны расширить свой вопрос, чтобы объяснить, какой механизм/механизм вы используете для выполнения тестов. Это будет ключом к выяснению наилучшего способа изолировать выходы из друг друга соответствующим образом. Когда вы говорите «устанавливаете», что вы имеете в виду, installutil? MSI? –

+0

Извините. Вот что происходит. У меня есть тестовое приложение, которое выполняет тестовые примеры один за другим. Тестовые примеры - это в основном методы класса. Тесты нацелены на тестирование установщика продукта. Поэтому каждый тестовый пример устанавливает продукт с помощью установщика InstallShield, а затем для проверки, я запускаю приложение (которое было установлено) с использованием метода, который я описал в вопросе. Я делаю некоторые основные операции, а затем закрываю приложение и удаляю его. Следующий тестовый пример повторяет одно и то же, за исключением того, что приложение установлено в другое место. ... продолжение – Poulo

0

Не могли бы вы предоставить нам больше информации? Я не смог воспроизвести эту ошибку.

Process.Start должен создать новый процесс со своим собственным AppDomain.

На моей машине я создал проект Harness, который имеет ссылку на проект DoNothing, которая является строго подписанной сборкой и ссылкой на проект LaodDoNothing, которая имеет ссылку на c: \ DoNothing.exe. Я вставил код ниже из Harness.Main с выводами отладки, как встроенные комментарии. Exes, суффикс с unsigned, не подписан.

//debug outputs when Main is jitted:'Harness.vshost.exe' (Managed): Loaded 'c:\project\DoNothing\Harness\bin\Debug\DoNothing.exe', Symbols loaded. 
//debug outputs when Main is jitted:'Harness.vshost.exe' (Managed): Loaded 'c:\project\DoNothing\Harness\bin\Debug\LoadDoNothing.exe', Symbols loaded. 

ZaZaZa.Main(); 
LoadDoNothing.Program.Main(); 
using (Process process = new Process()) 
{ 
    process.StartInfo.FileName = @"C:\donothingunsigned.exe"; 
    process.Start(); //debug outputs The thread 0x17f0 has exited with code 0 (0x0). No assemblies loads are logged to debug because this is a separate process. 


} 

using (Process process = new Process()) 
{ 
    process.StartInfo.FileName = @"C:\3\donothingunsigned2.exe"; 
    process.Start(); //Debug outputs The thread 0x1014 has exited with code 0 (0x0). No assemblies loads are logged to debug because this is a separate process. 
} 
AppDomain.CurrentDomain.ExecuteAssembly(@"C:\donothingunsigned.exe"); //debug outputs 'Harness.vshost.exe' (Managed): Loaded 'C:\donothingunsigned.exe' 
AppDomain.CurrentDomain.ExecuteAssembly(@"C:\3\donothingunsigned2.exe"); //no debug output because the loader realizes this assembly has already been loaded and uses that. 
+0

Я не совсем понял, что вы пытаетесь передать. Но я заметил, что вы запустили два разных исполняемых файла «donothingunsigned.exe» и «donothingunsigned2.exe». Моя проблема связана с попыткой запустить один и тот же исполняемый файл из разных мест. Именно это дает мне исключение при обстоятельствах, о которых я упомянул в этом вопросе, а также о последующих комментариях. – Poulo

+0

Мне не удалось воспроизвести ошибку, используя приведенные выше методы. Процессы не обмениваются приложениями, поэтому я не вижу, как Process.Start() может вызвать вашу ошибку. –