在关机时Revit复制addin dll

时间:2016-01-29 14:41:45

标签: batch-file dll revit-api

我正在创建一个revit插件,我想让它在关机时使用批处理文件自动提取.dll和.addin文件的副本。代码和批处理文件例程本身可以正常工作,但当我让它们彼此运行时,我得到了一个共享冲突,用于复制.dll文件。谁能告诉我如何解决共享违规问题?目的是将这两个文件部署到所有用户,并在关闭Revit时将文件更新复制到他们的计算机。

public Result OnShutdown(UIControlledApplication application)
{
    System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.StartInfo.FileName = "S:\\Revit 2015\\Addins\\Revit Tabs\\2015_RevitTab.bat";
    proc.StartInfo.WorkingDirectory = "S:\\Revit 2015\\Addins\\Revit Tabs\\";
    proc.Start();
    return Result.Succeeded;
}

这是复制语法

xcopy "S:\Revit 2015\Addins\Revit Tabs\Revit Tabs.addin" "C:\ProgramData\Autodesk\Revit\Addins\2015" /y

xcopy "S:\Revit 2015\Addins\Revit Tabs\Revit Tabs\bin\Debug\Revit Tabs.dll" "C:\ProgramData\Autodesk\Revit\Addins\2015" /y 

2 个答案:

答案 0 :(得分:1)

您可以添加对您自己的独立实用程序exe的调用,该调用监视当前Revit进程是否仍处于活动状态,并在Revit真正消失后执行加载项DLL复制过程。

答案 1 :(得分:0)

我想要进行相同的自动更新过程,经过一些试验和错误后,我发现了一些对我有用的代码。希望您可以使用它或改进它。

我有ribbon.addin,ribbon.dll(“Ribbon”)和commands.dll(“Commands”)文件。所有文件都作为部署的一部分安装到“%appdata%\ Autodesk \ Revit \ Addins \ 2016”文件夹(“本地”)中。由于写保护问题,将这些安装在“%appdata%”文件夹和“%programdata%\ Autodesk \ Revit \ Addins \ 2016”文件夹中非常重要!

功能区插件仅用于检查当前位于本地文件夹中的命令版本,以及是否已从共享网络文件夹(“共享”)中的命令文件中过时。由于安全性,我无法读取本地DLL或共享DLL的AssemblyVersion。为了解决这个问题,我在Local文件夹中有一个TXT文件,其中AssemblyVersion作为第一行,在Shared文件夹中我有另一个TXT文件(其中我实际上有命令addin的“关于”信息)共享命令AssemblyVersion作为第一行。

因此我的Ribbon OnStartup(UIControlledApplication a)代码使用System.IO.StreamReader检查TXT文件。如果本地文件已过期,则使用此更新本地TXT和DLL文件:

try
{
    string AddinsDir = a.ControlledApplication.CurrentUserAddinsLocation + @"\";
    string tempDir = System.IO.Path.GetTempPath();
    StreamWriter myStream = new StreamWriter(tempDir + "Commands.txt", false, System.Text.Encoding.Default);
    myStream.WriteLine(AssemblyVersion);
      //AssemblyVersion is the first line of the Shared Commands TXT file we read
    myStream.Close();

    File.Copy(tempDir + "Commands.txt", AddinsDir + "Commands.txt", true);
    File.Delete(tempDir + "Commands.txt");

    File.Delete(AddinsDir + "Commands.dll");
    File.Copy(SharedPath + "Commands.dll", AddinsDir + "Commands.dll", true);
      //SharedPath is the Shared folder
}
catch (Exception e)
{
    TaskDialog.Show("Error Loading Ribbon", "There was an error loading the Ribbon.  Please contact the BIM Manager for assistance.\n\n" + e.Message);
    return Result.Failed;
}

如果此时代码仍在运行,则该文件是最新的,是时候加载它了:

Assembly Commands = Assembly.LoadFrom(AddinsDir + "Commands.dll");
Type type = Commands.GetType("Commands.App");
  //Commands.App is my class where my Ribbon is created and Events are registered
object instanceOfCommands = Activator.CreateInstance(type, new object[] { a });
return Result.Succeeded;

我对Revit 2017部署的计划是在Ribbon.dll中创建我的自定义功能区,这样我就可以在那里使用“关于”按钮并随时可访问。然后,我将在“关于”对话框中添加一个按钮,该按钮将手动更新本地命令DLL。

我希望有所帮助!!