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

C# 为什么执行后Revit仍在使用我的DLL?,c#,revit-api,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 + "\\"

我有一个为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;
}
公共列表读取临时文件(字符串文件名,应用程序应用程序)
{
字符串username=Environment.username;
string myPath=“C:\\Users\\”+username+“\\AppData\\Roaming\\pyrovit\\”+app.VersionNumber+“\\”;
List readlines=新列表();
foreach(System.IO.Directory.GetFiles(myPath,“*”,SearchOption.AllDirectories)中的字符串文件)
{
if(file.Substring(file.Length-filename.Length,file.Length)==filename)
{
readlines=File.readlines(myPath+File).ToList();
}
}
返回读线;
}
我将其构建为DLL,然后从Revit中的插件调用它,没问题。但是,如果我返回代码并希望重新构建,我会收到一条错误消息,指出DLL正在被另一个进程使用,并被Revit阻止。为什么?

Revit在使用后是否需要执行特殊操作才能“释放”它?还是正常的行为


非常感谢

Revit使用所有DLL,即使在命令未执行时,也需要可视化菜单或使应用程序可以访问命令

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

编辑:(将VS 2017配置为在revit中调试)

  • 在解决方案中创建类库(.NET Framework)项目
  • 转到项目属性->调试,选择“启动外部程序”并找到revit.exe路径。(C:\Program Files\Autodesk\Revit 2019\Revit.exe)
  • 要调试当前项目,可以设置生成以将dll直接复制到revit使用的文件夹中。转到生成事件->生成后事件命令行,然后写入:
  • 复制“$(ProjectDir)*.addin”“$(AppData)\Autodesk\REVIT\Addins\2019” 复制“$(ProjectDir)bin\debug*.dll”“$(AppData)\Autodesk\REVIT\Addins\2019”

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


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

    Revit使用所有DLL,即使在命令未执行的情况下,这也是可视化菜单或使应用程序可以访问命令所必需的

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

    编辑:(将VS 2017配置为在revit中调试)

  • 在解决方案中创建类库(.NET Framework)项目
  • 转到项目属性->调试,选择“启动外部程序”并找到revit.exe路径。(C:\Program Files\Autodesk\Revit 2019\Revit.exe)
  • 要调试当前项目,可以设置生成以将dll直接复制到revit使用的文件夹中。转到生成事件->生成后事件命令行,然后写入:
  • 复制“$(ProjectDir)*.addin”“$(AppData)\Autodesk\REVIT\Addins\2019” 复制“$(ProjectDir)bin\debug*.dll”“$(AppData)\Autodesk\REVIT\Addins\2019”

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


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

    跟进我对是否重新启动Revit所做的评论。我在我的博客上写了一篇文章,解释了如何使用Revit附加模块管理器来实现您想要的结果:


    这与标准调试方法的区别在于,Revit使用
    LoadFrom()
    方法加载DLL,并在Revit.exe进程处于打开状态时将其锁定,而加载项管理器使用
    Load()
    方法,该方法仅读取DLL的
    字节[]
    ,这意味着其可用,您可以在VS中重新构建解决方案,并在Revit中重新加载,而无需关闭它。它显然有缺点,所以请阅读这篇文章

    跟进我对您是否重新启动Revit的评论。我在我的博客上写了一篇文章,解释了如何使用Revit附加模块管理器来实现您想要的结果:


    这与标准调试方法的区别在于,Revit使用
    LoadFrom()
    方法加载DLL,并在Revit.exe进程处于打开状态时将其锁定,而加载项管理器使用
    Load()
    方法,该方法仅读取DLL的
    字节[]
    ,这意味着其可用,您可以在VS中重新构建解决方案,并在Revit中重新加载,而无需关闭它。它显然有缺点,所以请阅读这篇文章

    尝试重建Revit时,它是否仍处于打开状态?是。因此,现在我重新启动它,但我想知道是否有其他替代方法..?在尝试重建Revit时,Revit是否仍处于打开状态?是的。所以现在我重新启动它,但我想知道是否有其他选择….?非常感谢。我不太清楚我在做什么,所以你能确认一下吗?在我的VS(2017)项目中,我添加了一个新文件Revit.exe。然后我右键单击它并“启动新实例”。之后,我看到有一个“暂停”和一个“停止”图标,但如果我点击“暂停”,我仍然无法修改代码(弹出窗口告诉我我不能修改)。我做错了什么?谢谢谢谢。我不太清楚我在做什么,所以你能确认一下吗?在我的VS(2017)项目中,我添加了一个新文件Revit.exe。然后我右键单击它并“启动新实例”。之后,我看到有一个“暂停”和一个“停止”图标,但如果我点击“暂停”,我仍然无法修改代码(弹出窗口告诉我我不能修改)。我在做什么