动态加载.dll文件后释放.dll和.pdb

时间:2018-05-30 23:53:45

标签: c# assemblies coded-ui-tests dynamic-assemblies

我正在构建一个Windows应用程序,我可以通过单击按钮调用编码的UI项目(项目名为RecordAndPlayback)。我的目标是在编码的UI项目中调用测试方法,然后能够修改测试,然后从我的win应用程序中调用它,而不使用相同的按钮关闭它。

我设法调用了测试方法,但之后修改测试方法时遇到了问题。每当我构建我的编码UI项目时,我都会收到错误

  

错误CSC(0,0):创建调试信息文件出现意外错误'... \ _对象\ Debug \ RecordAndPlayback.PDB' - '... \ _ \ _对象\调试\ 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文件已经发布,因为我可以删除它。此外,bin文件夹中的.pdb文件已发布(也可以删除它)。我的问题是obj文件夹中的.pdb文件。唯一的方法是我必须关闭我的Windows应用程序项目,以便我可以构建我的编码UI项目。

如何在不关闭我的赢取应用程序的情况下解决此问题?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。我尝试了很多在线发布的解决方案,他们都遇到了同样的问题。 .dll文件正被另一个进程使用,或者.pdb文件正由另一个进程使用。

我上面提到的代码,正如我所提到的那样,除了.pdb文件之外,我正在使用它。老实说,我找不到它的解决方案。所以,我解决了这个问题。我修改了构建选项,所以我根本不生成.pdb文件。

为了禁用pdb文件生成,您需要在单击Build选项卡下部的the plt.axis('Equal')按钮后使用项目属性中的"Advanced build settings"对话框。

为发布版本配置设置"Advanced...",不会生成任何pdb文件。

这个已修复我的问题。虽然它没有真正解决它,但我删除了导致问题的文件。希望这有助于其他