我正在创建一个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
答案 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文件。如果本地文件已过期,则使用此c#更新本地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。
我希望有所帮助!!