Отпустите .dll и .pdb после динамической загрузки .dll-файла - PullRequest
0 голосов
/ 31 мая 2018

Я создаю приложение для 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?

1 Ответ

0 голосов
/ 01 июня 2018

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

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

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

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

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

...