为什么我的DLL在执行后仍被Revit使用?

时间:2019-03-20 08:54:52

标签: c# revit-api

我有一个为Revit API编写的C#代码:

public List<string> Read_temp_file(string filename, Application app)
{
    string username = Environment.UserName;
    string myPath = "C:\\Users\\" + username + "\\AppData\\Roaming\\pyRevit\\" + app.VersionNumber + "\\";
    List<string> readlines = new List<string>();
    foreach (string file in System.IO.Directory.GetFiles(myPath, "*", SearchOption.AllDirectories))
    {
        if (file.Substring(file.Length - filename.Length,file.Length) == filename)
        {
            readlines = File.ReadLines(myPath + file).ToList();
        }
    }
    return readlines;
}

我将其构建为DLL,然后从Revit中的插件中调用它,没问题。但是然后,如果我回到代码中并想要重新构建,则会收到一条错误消息,指出该DLL正在被另一个进程使用,并被Revit阻止。为什么?

使用Revit在使用后“释放”它是否需要做些特别的事情?还是正常行为?

非常感谢!

2 个答案:

答案 0 :(得分:1)

即使命令未执行,Revit也会使用所有dll,这对于可视化菜单或使命令可用于应用程序是必需的。

如果要调试代码,可以将项目调试配置为以revit.exe为目标,然后在打开revit时暂停执行以更改代码(我使用Visual Studio 2017)。

编辑 :(将VS 2017配置为在Revit中进行调试)

  1. 在解决方案中创建一个类库(.NET Framework)项目。
  2. 转到项目“属性”->“调试”,选择“启动外部程序”,然后找到您的revit.exe路径。 (C:\ Program Files \ Autodesk \ Revit 2019 \ Revit.exe)
  3. 要调试当前项目,您可以设置内部版本以将dll直接复制到revit使用的文件夹。转到构建事件->构建后事件命令行,然后输入:

复制“ $(ProjectDir)*。addin”“ $(AppData)\ Autodesk \ REVIT \ Addins \ 2019” 复制“ $(ProjectDir)bin \ debug * .dll”“ $(AppData)\ Autodesk \ REVIT \ Addins \ 2019”

此命令会将adin和dll复制到revit可以找到它的文件夹中,这样您将在revit中拥有当前版本。

4.(额外的步骤),您还可以自动打开项目以使其变得更容易,请转到“调试”->“启动选项”->“命令行参数”,然后写入.rvt文件的路径。

答案 1 :(得分:1)

在评论之后,我决定是否要重新启动Revit。我在博客上写了一篇文章,解释了如何使用Revit加载项管理器来获得您想要的结果:

http://archi-lab.net/debugging-revit-add-ins/

此方法与标准调试方法之间的区别是Revit使用LoadFrom()方法加载DLL,并在Revit.exe进程打开的同时将其锁定,同时使用外接程序管理器使用Load()方法,该方法仅读取DLL的byte[],这意味着它可用。您可以在VS中重新构建解决方案,并在不关闭它的情况下在Revit中重新加载。它确实有缺点,所以请阅读这篇文章。