Освободите .dll и .pdb после динамической загрузки файла .dll

Я создаю приложение для Windows, в котором я могу вызвать закодированный проект пользовательского интерфейса (проект с именем RecordAndPlayback), нажав кнопку. Моя цель - вызвать методы тестирования в закодированном проекте пользовательского интерфейса, а затем иметь возможность изменить тест, а затем вызвать его обратно из моего приложения win, не закрывая его с помощью той же кнопки.

Мне удалось вызвать тестовый метод, но после этого у меня возникла проблема с изменением тестового метода. Всякий раз, когда я создаю свой закодированный проект пользовательского интерфейса, я получаю сообщение об ошибке

ОШИБКА CSC(0,0): непредвиденная ошибка при создании файла отладочной информации '...\obj\Debug\RecordAndPlayback.PDB' -- '...\obj\Debug\RecordAndPlayback.pdb: процесс не может получить доступ к файлу, поскольку он используется другим процессом.

Я использовал AppDomain для загрузки в него dll, а затем выгрузил AppDomain в надежде, что dll будет выпущена. Мне удалось это сделать, но затем я получил указанную выше ошибку в файле .pdb. Я нашел другое решение, которое я нашел намного проще, но все же столкнулся с вышеуказанной проблемой.

Вот мой пример кода:

string dllPath = @"...\bin\Debug\RecordAndPlayback.dll";
byte[] fileContent;
using (FileStream dll = File.OpenRead(dllPath))
{
    fileContent = new byte[dll.Length];
    dll.Read(fileContent, 0, (int)dll.Length);
}
var DLL = Assembly.Load(fileContent);

Playback.Initialize();

foreach (Type type in DLL.GetExportedTypes())
{
    if (type.Name == "CodedUITest1")
    {
        var c = Activator.CreateInstance(type);
        try
        {
            type.InvokeMember("CodedUITestMethod1", BindingFlags.InvokeMethod, null, c, new object[] { });
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        break;
    }
}
Playback.Cleanup();

Я пытался использовать AppDomain, но это не сработало. На самом деле приведенный выше код - лучшее, что я получил до сих пор, я уверен, что файл .dll выпущен, так как я могу его удалить. Также освобождается файл .pdb в папке bin (тоже смог его удалить). Моя проблема - файл .pdb в папке obj. Единственный способ - я должен закрыть свой проект приложения Windows, чтобы я мог создать свой закодированный проект пользовательского интерфейса.

Как я могу это исправить, не закрывая приложение win?


person Islam El-gendy    schedule 30.05.2018    source источник
comment
Где ваш код, который использует AppDomain? Это был бы правильный подход. Может быть, вы делали что-то не так с этим.   -  person Jacob    schedule 31.05.2018
comment
Я использовал решение здесь и поместил код AppDomain в метод DoWork(). Код, который я разместил, - это тот, который у меня есть в вопросе.   -  person Islam El-gendy    schedule 31.05.2018


Ответы (1)


Я нашел решение своей проблемы. Я пробовал много решений, размещенных в Интернете, и у всех была одна и та же проблема. Либо файл .dll используется другим процессом, либо файл .pdb используется другим процессом.

Код, который у меня есть выше, как я уже упоминал, работает, за исключением файла .pdb, для которого, честно говоря, я не нашел решения. Итак, я работал над этим. Я изменил параметр сборки, поэтому я вообще не создаю файл .pdb.

Чтобы отключить генерацию файла pdb, вам нужно использовать диалоговое окно "Advanced build settings", доступное в свойствах проекта после нажатия кнопки "Advanced...", расположенной в нижней части вкладки "Сборка".

Установите Output - Debug info: to None для конфигурации сборки выпуска, и файлы pdb создаваться не будут.

Это решило мою проблему. Хотя на самом деле это не исправило, но я удалил файл, вызывающий проблему. Надеюсь, это поможет другим

person Islam El-gendy    schedule 01.06.2018